发表于: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()返回的错误。在任一情形下,关闭连接