类似下图这样的,以前在多个帖子中曾展示过,今天来聊一下接口背后的设计思考。
这张图片描述的案例场景是:5个同一品牌温控器连接到一个CB1241的485端口上。
Port485:这个参数不需多说,任何与本地485口编程有关的都会用到。对于本帖案例它指的是一个CB1241模块。
MBCommLoad和MBMaster:我是一直把通信当作IO来看待的。普通常见的IO都是单一、固定和孤立的。通信则是I和O的组合,而且I和O之间存在异步、跨扫描周期的行为关联。究其本质,通信就是因协议而关联到一起的IO复合体。
通信和普通IO区别就在于:普通IO上是不存在双向交互协议的。普通IO都是单向信息。
通信= I + O + 协议
协议是工控和IT的灵魂。一个程序员是否可以自己搭建通信协议,是个分水岭。
所以对通信的IO操作,与普通IO不同,实际上是对协议执行指令的操作,而非直接操作底层硬件。所以对于本帖案例中温控器而言的IO,就是MBCommLoad和MBMaster这两个指令。
对于本帖案例而言,Port485、MBCommLoad和MBMaster,三者共同构成了直接走PLC本体485模块的modbus底层IO资源。
换言之,对于其它物理通道方式的Modbus通信,IO资源组合是不一样的。
下图是走UDP的Modbus通信的IO资源
下图是走TCP的Modbus通信的IO资源
这些协议操作的基础指令,都需要数据块实例。随便拖拽生成一个即可。
有的时候官方的基础指令未必够用或好使,可以自己另做。比如MB_Master_PtP和ModbusUDP (Master only),这两个我在其它帖子中提供过SCL源码供大家下载。
本例中的5个温控器的各自IO资源参数设定完全一样。
都是连在一个物理端口上,也都使用同一对MBCommLoad和MBMaster实例。既然是唯一公共IO资源,就没必要给每个温控器单独预备和独占。
也就是说,如果你有多个与PLC本体直连的485串口模块,就需要给每个端口,预备一对MBCommLoad和MBMaster实例,供连接在该端口的所有设备竞争和轮流使用。
注意:本帖案例中,因为用的是PLC本体上的串口模块,所以使用的是低版本的官方Modbus指令,指令执行速度会更快一点。如果是分布式应用,需要用高版本的。