在PLC通信配置过程中,遇到一个常见问题:不同型号PLC之间的高低字节顺序是不同的。这让我陷入了困惑,直到我通过深入的调试和测试,最终找到了原因并成功解决了问题。以下是我一步步解决该问题的过程。
我所使用的PLC系统是倍福PLC与西门子PLC通过Profibus协议进行通信。在我的设置中,倍福PLC作为主站,而西门子PLC则作为从站。在配置时,我设置了64字节的输入输出数据区。
问题出现在我收到西门子PLC传输的数据时。当我从左到右查看数据的5至8字节(标记为蓝色),我发现这部分数据应该是我所需要的Dword1数据。这个数据的16进制值是00000924,在程序中显示的十进制数值为604569600,西门子PLC发来的正确值应该是2340。这一对比结果让我感到非常困惑。
我查看了西门子PLC发来的原始16进制数据,确认它的确是00000924。为了确保没有出错,我将这个数据输入计算器进行转换,果然,它转换为的十进制值就是2340。为什么我在程序中看到的数值却是604569600呢?
经过一番深思,我忽然记起了以前在厕所听到一个工程师提到过“高低字节反了”的问题。当时我并没有太在意,但现在这一点却让我茅塞顿开,难道我遇到的也是这个问题?
于是,我开始着手验证这个想法。我首先尝试交换字节顺序,将00002409中的两个字节24和09的位置互换,看看是否能得到正确结果。结果我在程序中得到的十进制数值为9225,显然依然不对。那么,问题究竟出在哪里呢?
于是,我进一步分析了数据的结构,意识到如果是Dword(四字节数据),那么可能需要进行两次字节顺序的转换。我将每两个字节交换位置,得到了新的数据24090000,此时程序中显示的十进制值恰好是2340,正好匹配西门子PLC发来的正确数值。
通过这一系列的实验和验证,我终于确认了问题所在。原来,西门子PLC和倍福PLC在进行数据交换时,确实存在高低字节顺序的差异,导致倍福PLC接收到的数据值与西门子发来的数据不一致。
具体来说,西门子发过来的数据结构如下所示:
(图中显示西门子发送的字节顺序)
而倍福PLC接收到的数据结构则如下:
(图中显示倍福接收的字节顺序)
可以看到,在倍福PLC接收到的数据中,原本应为Dword的一对高低字节已经发生了交换。这意味着在处理Dword时,我们需要进行两次字节顺序转换。第一次是每个Word的高低字节互换,第二次是两个Word的位置互换。
如果只涉及到单个Word数据的传输,那么只需要将其中的高字节和低字节进行交换即可,操作要简单得多。
通过这次调试,我终于理解了这一现象的根本原因,并且掌握了如何正确处理不同PLC之间数据交换时的字节顺序问题。这不仅解决了我的通信问题,也让我对PLC的工作原理有了更深的理解。