在工业自动化领域,PLC(可编程逻辑控制器)与PC之间的通信是实现自动化控制的关键环节。本文将介绍一种基于.NET的Omron PLC系列与PC之间实现实时通信的方法,这种方法不仅易于理解,而且开源,能够确保RS232/485 PC-PLC通信的安全性和可靠性。
面向对象编程(OOP)和实时硬件依赖的精确实现是编程中的一个挑战。作者在DeltaDTB PID控制器项目中曾有过相关经验,感兴趣的读者可以点击此处进行参考。
在阅读Omron提供的关于Host Link属性的PDF文件后,最令人困惑的问题之一就是物理连接(电缆布线)。作者最初尝试了一些布线,但并未成功。最终,传统的RS232(2-2, 3-3, 5-5)连接方式被证明是正确的(如下图所示)。
在Host Link通信协议中,主机计算机(注意Omron将“计算机”用于其PLC系列,请不要混淆!)具有传输优先级。但在点对点连接的情况下(例如,直接通过RS232物理层连接到PLC),这一点并不非常重要。
一个数据块通常由一个单元称为帧组成,但长数据块(超过131个字符)必须在传输前分成多个帧。在多链路系统中,第一个帧最多可以有131个字符,后续帧最多可以有128个字符。
要从计算机(主机计算机)发送一个包含多个帧的命令块,最初只发送块中的第一个帧。必须等待发送下一帧,直到主机计算机收到应从PC发送回的分隔符。
要从PC接收一个包含多个帧的响应块,主机计算机必须在收到PC发送的分隔符后发送回车码(分隔符)到PC。这使得PC能够发送下一帧。
单元地址、寄存器地址以及要读取的寄存器数量必须以十进制格式表示,要读取/写入的寄存器内容必须以十六进制格式表示,布尔值表示为"1"(ASCII 49dec)(true)和"0"(ASCII 48dec)(false)。
帧校验和是8位数据转换为两个ASCII字符。8位数据是通过对帧中从第一个字符到最后一个文本字符的每个字符依次执行异或运算得到的。
Dim xor As Integer = IIf(is_last, 0, 64) ' @ascii code
For I As Integer = 1 To Message.Length - 1
xor = xor Xor Convert.ToInt32(Convert.ToChar(Message.Substring(I, 1)))
Next
Return ([String].Format("{0:X}", xor))
第60至62页的表格提供了Host Link单元可用的命令和响应,命令级别以及它们适用的模式。命令和响应格式的详细信息在Omron文档的第4节“命令和响应”中给出。
程序找不到任何PLC(没有来自PLC的响应)。
程序找到了PLC(收到了响应)。