计算3964R串行通信协议的BCC



我正在尝试编写一些代码,以通过使用SIEMENS 3964R协议的Serial与旧设备进行通信。这包括一个校验和更准确的传输末端BCC(块检查字符(。ETX之后的一个char。文档将BCC定义为:

使用3964R传输协议,通过发送附加块来增强数据安全性检查字符(BCC =块检查字符(。块检查字符是纵向奇偶校验(所有数据的Exor逻辑操作(字节(已发送或接收的块。它的计算始于用户数据的第一个字节(首先框架的字节(在连接建立之后,并在dle etx字符之后结束在连接终止时。

这是十六进制中的一些示例数据。53 54 41 54 55 53 10 03 07

07是BCC。

4d 45 41 53 4d 50 54 45 53 54 41 41 41 552 47 30 30 30 55 78 30 31 2E 31 2E 31 2E 30 31 31 31 31 31 31 31 31 31 31 31 30 10 03 61

61是BCC。

我一般都知道如何进行XOR操作,但是我无法弄清楚给我适当的BCC的任何事情组合。我认为我正在解释错误的定义。

我首选的语言是javaScript,因为它是一个node.js electron应用程序。我可以阅读缓冲区并获得十六进制值。我可以构建提议者消息。但是直到我可以包含适当的BCC,它才能正常工作。因此,只是寻找比我更聪明的人确切地知道如何产生有效的BCC。

谢谢!

发布的文档作为第一个注释具有正确计算3964R BCC的正确结构。该文档在这里:

https://support.industry.siemens.com/cs/attachments/1117397/S7300_CP341_MANUAL_MANUAL_EN_EN_EN-US.PDF?DOWNLOAD= True

这是一个简单的JavaScript函数。六边形将被传递,而不是像这里那样进行硬编码,但这可以准确地计算出该特定协议的BCC。如果有人在乎或需要它。我刚刚将BCC写入了该控制台的十六进制字符串,但是您可以使其成为一个函数并实际返回可用的内容。

var hexarr = ['4d', 45, 41, 53, '4d', 50, 30, 30, 10, 03];
var bcc = 0;
var xor = 0;
for(var i= 0; i< hexarr.length; i++){
    var hexint = parseInt(hexarr[i],16);
    if(i==0){ xor = hexint; }
    else {
        bcc = xor ^ hexint;
        xor = bcc;
    }
}
console.log(bcc.toString(16));

最新更新