MODBUS TCP/IP(三)
(2012-07-25 20:25:41)
标签:
it |
分类: 技术文章 |
附 录
A. 客户机和服务器应用指南
本部分的注释不应当作与客户机和服务器的任何特殊的应用捆绑起来。但是,当应用多厂商系统和网关去安装MODBUS设备,遵从这些内容将大大减小综合的“疑难”。
A.1客户机设计
u
使用CONNECT()建立到所需服务器端口502的连接。
u
准备一个MODBUS请求,用前面介绍的方法编码。
u
提交MODBUS请求,包括其6字节的MODBUS/TCP前缀,作为单一的缓冲用SEND()传输。
u
在同一TCP连接上等待响应出现。如果希望所考虑的通讯比TCP正常报告的快,用选择()在这一步随意的运行超时指令。
u
用RECV()读取响应的前6个字节,它将指出响应消息的实际长度。
u
用RECV()读取响应的剩余字节。
在超时等待响应的事件中,发布单方面关闭连接指令,打开新的一个连接,重新提交请求。此技术允许客户机控制适时重试,这优于TCP默认(设置)所能提供的功能。它也允许可靠备用策略,例如在基干网失效时,用一个总体上独立的通讯网络提交请求给一个备用的IP地址。
A.2 服务器设计
或者多线程或者单线程的模型能用于处理多个连接。在后续章节叙述。
A.2.1 多线程服务器
A.2.2单线程服务器
其结构如下:
将其状态设为“空闲”来初始化多态计算机。
LISTEN()用于引入的到端口502的TCP连接
现在,开始无限循环检查“LISTEN”端口和多态计算机如下:
对每一多态计算机
如果状态是“新的请求”:用SELECT()来看请求是否到达通常设超时为0,既然由于该特殊连接处于休止状态,你不愿意挂起该事务。
通过在每循环基础上把多个SELECT()调用结合为一个单一的调用来优化性能而不影响应用程序的函数结构是可能的。
A.3 必须的及期望的性能
客户机被鼓励关闭和重建仅用于数据访问(非PLC程序设计)的MODBUS/TCP连接,而且此处的预期时间在下次使用之前是有意义的,比方说超过1秒。如果客户机遵从这一原则,具有有限连接资源的服务器将能为大批客户机提供服务,也有利于错误校正策略如可选目标IP地址的挑选。应该记得,关闭和重开连接所造成的的额外通讯和CPU负荷比得上单个Modbus事务所造成的。
第一个寄存器比特 15 - 0 = 数据对象比特 15 - 0
第二个寄存器比特15 - 0 = 数据对象比特 31 - 16
第三个寄存器比特 15 - 0 = 数据对象比特 47 - 32
等等
B.1指令字中的比特数
这样一个指令字 (寄存器值)中
离散 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)
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 单精度实数
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 位
前一篇:MODBUS TCP/IP(二)
后一篇:内网外网如何同时使用

加载中…