卓越信通TSC工业以太网知识百科----MODBUS TCP/IP(三) 点击:777 | 回复:1



工业交换机

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 24回
  • 年度积分:0
  • 历史总积分:72
  • 注册:2008年2月19日
发表于:2008-02-29 13:16:00
楼主
         本内容由 [b]卓越信通TSC工业以太网交换机[/b] 提供 

A. 客户机和服务器应用指南
 
本部分的注释不应当作与客户机和服务器的任何特殊的应用捆绑起来。但是,当应用多厂商系统和网关去安装MODBUS设备,遵从这些内容将大大减小综合的“疑难”。 
     下面的软件结构假设在熟悉BSD Sockets 服务器接口基础上, 正如用于UNIX and Windows NT。
                               
A.1客户机设计
                               
   ODBUS/TCP的设计使客户机的设计尽可能简化。软件的例子在别处有,但是处理事务的基本过程如下所给: 
u     使用CONNECT()建立到所需服务器端口502的连接。 
u     准备一个MODBUS请求,用前面介绍的方法编码。 
u     提交MODBUS请求,包括其6字节的MODBUS/TCP前缀,作为单一的缓冲用SEND()传输。 
u     在同一TCP连接上等待响应出现。如果希望所考虑的通讯比TCP正常报告的快,用选择()在这一步随意的运行超时指令。 
u     用RECV()读取响应的前6个字节,它将指出响应消息的实际长度。 
u     用RECV()读取响应的剩余字节。 
    如果接下来没有可能的连接到这个特别的目标,就关闭TCP连接以使服务器的资源可以在间歇期为其它客户机服务。允许向客户机开放连接的最大时间是1秒。 
在超时等待响应的事件中,发布单方面关闭连接指令,打开新的一个连接,重新提交请求。此技术允许客户机控制适时重试,这优于TCP默认(设置)所能提供的功能。它也允许可靠备用策略,例如在基干网失效时,用一个总体上独立的通讯网络提交请求给一个备用的IP地址。
 
 
A.2 服务器设计
                               
    MODBUS/TCP服务器应设计的可以支持多个并发的客户机,甚至在计划内用户只有单一客户时也要能响应(并发)。这就允许客户机高速的顺序关闭和重开连接以对无发送的响应作出快速反应。 
    如果使用了传统的TCP协议组,减小接收和发送缓冲区的尺寸可以节省内存资源。一个采用UNIX或NT的TCP服务器通常分配每个连接8K字节或更多的接 收缓存以鼓励从如文件服务器等设备“流畅的”传送数据。这样的缓冲器空间在MODBUS/TCP中没有价值,因为请求和发送的最大尺寸小于300字节。通 常为附加的连接资源交换存储空间是可行的。 
或者多线程或者单线程的模型能用于处理多个连接。在后续章节叙述。
 
A.2.1 多线程服务器
                               
    操作系统或鼓励多线程应用的语言,如JAVA,能用多线程策略,叙述如下:
                               
    用LISTEN()等待引入到端口502的TCP连接。 
    当收到新的连接请求时,用ACCEPT()接受它并产生新的线程来进行连接操作 
    在新的线程期间,无限循环的做以下工作: 
    为6字节的MODBUS/TCP头部发布一个RECV(6)请求。不要在此设置超时,而要等待直到一个请求到达或是连接关闭。两种情况都能自动激起线程。 
    分析这头部。如果频繁出现,如协议字段非0或消息长度超过256字节,那么单方面关闭连接。这是服务器对隐含TCP编码出错的情况的正常反应。 
    为消息剩下的已知长度的字节发布一个RECV()。特别注意发布一个带有这样长度限制的RECV()将允许坚持“流水线操作”请求的客户机。任何这样的流 水线操作请求将保留在服务器或是客户端的TCP缓冲区,并在当前的的请求得到完全服务后选取。 
    现在处理引入的MODBUS消息,如果必要,挂起当前的线程直到正确的响应计算出来。最终,你或者拥有了一个有效的MODBUS消息,或者作为响应的异常消息。
                               
    为响应产生MODBUS/TCP前缀,从请求的字节0和1复制“事件标识符”字段,并重新计算长度字段。 
    提交包括MODBUS/TCP前缀的响应,当作连接上的单一传送缓冲器,用SEND()。 
    Go back and wait for the next 6 byte prefix record.
                               
    最后,当客户端选择关闭连接,6字节前缀的RECV()将失效。有序的关闭通常会使RECV()字节数回0。强制关闭可能会产生从RECV()返回的错误。在任一情形下,关闭连接



工业交换机

  • 精华:1帖
  • 求助:0帖
  • 帖子:14帖 | 24回
  • 年度积分:0
  • 历史总积分:72
  • 注册:2008年2月19日
发表于:2008-02-29 13:17:00
1楼
            本内容由 [b]卓越信通TSC工业以太网交换机[/b] 提供  

B. 非指令数据的编码
                               
    在MODBUS上传送大批量信息的最有效办法是采用功能代码3(读寄存器),16(写寄存器),或可能的23(读/写寄存器)。 
    虽然这些功能根据它们在16位寄存器上的操作来定义,它们能够将任何类型的信息从一台设备转到另一台,只要这些信息能用接近16位指令的区段来描述。 
    早期的MODBUS-capable PLC’s专用于使用“big-endian”体系结构的计算机。大多数现代的PLC’s基于采用“little-endian”体系结构的商用微处理 器。MODBUS潜在的被用于在这两种体系之间交换数据这一事实引入一些会迷惑粗心者的微妙之处。 
    几乎所有不同于原始“离散比特”和“16位寄存器值”的数据类型在引入little-endian微处理器后被提出来。因此MODBUS上数据类型的表示法遵从了little-endian 模式,含义
                               
第一个寄存器比特 15 - 0 = 数据对象比特 15 - 0
第二个寄存器比特15 - 0 =  数据对象比特 31 - 16
第三个寄存器比特 15 - 0 = 数据对象比特 47 - 32
等等
 
B.1指令字中的比特数
                               
     Modicon PLC’s 在984 Ladder Language中有预先确定的功能,它将一系列临近的寄存器值转换为相等长度的1-比特“离散”的块。最常用的功能是BLKM (块移动)。
                               
    由于与最初的big-endian体系结构保持一致,该离散值从最大有效位开始编号会带来混乱,所有的编号序列从1开始,而非从0。(本手册中的比特编号总是从作为最小意义位的0开始,以与现代的软件文件保持一致。)
                               
这样一个指令字 (寄存器值)中
离散 1将是 bit 15 (值 0x8000)
离散2 将是 bit 14 (值0x4000)
离散3 将是 bit 13 (值0x2000)
离散4 将是 bit 12值0x1000)
离散5 将是 bit 11 (值0x0800)
离散6 将是 bit 10 (值0x0400)
离散7 将是 bit 9 (值0x0200)
离散8  将是 bit 8 (值 0x0100)
离散 9  将是  bit 7 (值0x0080)
离散10 将是 bit 6 (值0x0040)
离散11 将是 bit 5 (值0x0020)
离散12 将是 bit 4 (值0x0010)
离散13 将是 bit 3 (值0x0008)
离散14 将是 bit 2 (值0x0004)
离散15 将是 bit 1 (值0x0002)
离散16 将是 bit 0 (值0x0001)
 
    当多于16比特时,例如一个32点的离散输入模数,离散1到16将在第一寄存器,离散17到32将在第二寄存器。 
    这个编码的约定对于理解在MODBUS/TCP上何时处理离散输入和输出设备,什么地方离散编码和Modicon PLC’s相一致特别重要。 
    特别的,注意到指令字中的比特的IEC-1131编码约定是从0(最小意义位)到15(最大意义位),这与离散编码是相反的。
                               
                              B.2 多指令字变量
                               
    原则上,任何能被“投”到16位指令字序列的数据结构都可被传输,并且以同样的数据格式到达设备。 
    以下的 PLC数据类型应该注意 
B.2.1 984 数据类型
 
984 16-位 无符号整数
正常含义: 整数的位 15 - 0 = 寄存器的位 15 - 0
 
984 16-位 有符号整数
正常含义: 整数的位 15 - 0 = 寄存器的位 15 - 0
 
984 ASCII
尽管 PLC’s 没有这样的电文处理能力,最初的ladder language的编者允许用2个ASCII字符来表示寄存器。第一个字符表示上半字节(比特15-8),第二个字符表示下半字节(比特7-0)。特别注 意这与现代PLC’s所用的高级语言如C等的使用是相反的。
                               
984浮点数 
Intel 单精度实数
    第一寄存器包含32-位数的15-0位(有效位的15-0位)
    第二寄存器包含32-位数的31-16位(说明部分和有效位的23-16)
                               
984 单精度十进制无符号数
尽管值的范围局限于0-9999,数据表示和16位无符号整数相同。
 
984 双精度十进制无符号数
这个数据格式现在很少用,除了旧格式的4位十进制表示。
值的范围从0到99999999。第一个寄存器包含了最有意义的4位,第二寄存器包含了最无意义的4位,每个用0-9999范围内的二进制值表示。
                               
B.2.2 IEC-1131 数据类型
所有的 IEC-1131 数据类型在Modicon PLC’s以little-endian的形式来表示。例子如下 
BYTE  8-位数。
寄存器的7-0位 = BYTE 的 7 - 0 位
DINT  32-位数。
第一寄存器的15-0位 = DINT 的 15 - 0 位
第二寄存器的15-0位 = DINT 的 31-16 位
INT
寄存器的15-0位 = INT 的 15 - 0 位
REAL  32-位 Intel 单精度实数。
第一寄存器的15-0位 = REAL 的 15 - 0 位 (有效位的15-0位)
第二寄存器的15-0位 = REAL 的 31-16 位(说明及有效位的23-16位)
UDINT  32-位数。
第一寄存器的15-0位 = UDINT 的 15 - 0 位
第二寄存器的15-0位 = UDINT 的 31-16 位
UINT
寄存器的15-0位 = UINT 的 15 - 0 位

热门招聘
相关主题

官方公众号

智造工程师