http://www.rtaautomation.com/technologies/modbus-tcpip/10855017
https://infosys.beckhoff.com/english.php?content=../content/1033/ek9000/index.html&id=
client事务流程:
1.用connect() 建立TCP/IP 连接
2.对将要发送的Modbus请求,进行编码(编码方式见下一环节)
3.提交Modbus请求,包括6字节 modbus tcp前缀。整个请求作为一个buffer通过send()发送
4.等待同一个TCP/IP连接返回应答消息。在这里,用select增加一个超时判断
- 使用recv()读取应答消息,应答的头6字节表明应答消息的实际长度
6.使用recv()读取剩下内容 - 如果没有进一步的消息请求,关闭连接。通常每个客户端等待连接时间为1s
server端事务流程:
1.使用listen()监听502端口,等待收到请求或者连接关闭
2.当收到新的链接请求,采用accept()接受请求,并产生一个新的进程来处理链接
3.分析头部,如果出错,比如,协议区域不是0,或者长度大于256,于是UNILATERELLY CLOSE THE CONNECTION. 这是server端遇到TCP/IP错误时正确的应答消息。
- 用recv()读取剩下信息,长度未知。可挂起当前进程等待获取长度后再操作
5.生成应答消息头部,将请求的第0 和1 字节拷贝为事务标示,然后重新计算长度 - 提交请求,通过send() 发送
- 返回,等待下一个消息