Расчет BCC для протокола последовательной связи 3964r - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь написать код для связи со старым устройством через последовательный порт, который использует протокол Siemens 3964r. Это включает в себя контрольную сумму, или, точнее, BCC (символ проверки блока) в конце передачи. Один символ после ETX. Документы определяют 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 4e 41 50 52 47 30 30 30 55 78 30 31 31 2e 30 30 5a 30 31 31 31 30 10 03 61

61 - это BCC в этом.

В целом я знаю, как выполнять операции XOR, но я не смог выяснить какую-либо комбинацию вещей, которая дает мне надлежащий BCC. Я думаю, что я неправильно понимаю определение.

Мой предпочтительный язык для этого - javascript, так как он предназначен для электронного приложения node.js. Я могу прочитать буфер и получить шестнадцатеричные значения. И я могу построить сообщения propoer обратно. Но это не будет работать правильно, пока я не смогу включить правильный BCC. Так что просто ищу кого-то умнее меня, который точно знает, как создать действительный BCC.

спасибо!

1 Ответ

0 голосов
/ 26 мая 2019

Документ, опубликованный в качестве первого комментария, имел правильную структуру для расчета 3964r BCC.Этот документ находится здесь:

https://support.industry.siemens.com/cs/attachments/1117397/s7300_cp341_manual_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));
...