Источник
Сначала нужно определиться, что именно будем читать. Для начала я не стал
брать последовательные порты или другие устройства, а решил воспользоваться
псевдоустройством... поэтому будем читать случайные числа из
/dev/urandom. Это не совсем
то, что мне хотелось бы проверить, но пока обойдемся этим. Как вариант можно
считать память операционной системы через
/dev/mem. Сервис TwinCAT под
BSD запускается с root доступом, поэтому проблем возникнуть не должно.
Прочитанное из устройства, можно просто сохранить в массив, но мы сделаем два
дела сразу — кроме чтения устройства, сохраним результат в файл, лежащий на
другом ПЛК. Итого: два ПЛК (один с TC/BSD, другой с Windows), соединены
обычной локальной сетью Ethernet. На одном ПЛК читаем случайные числа из
файла-псевдоустройства, а результат сохраняем на другой ПЛК в настоящий файл.
Код
Код настолько простой, что смотреть особенно не на что: ряд обычных файловых
операций. Именно в этом заключается преимущество подхода "всё есть файл".
Открывать несколько файлов можно с помощью одного и того же ФБ. Главное делать
это последовательно: сначала один, затем другой. Основная задача получить
хендлер файла для дальнейших файловых операций. Нам нужно получить два
хэндлера, от двух файлов, заданных следующими
путями: sDevPath — задает путь к источнику
'/dev/urandom' и sResPath — путь к файлу с
результатом 'c:\dev\random.txt'. Сразу видно — где Юникс, а где Виндовс
(подсказка, обратить внимание на /слэши/ в путях). В финале добавим в
константы VAR CONSTANT адрес удаленного ПЛК:
sRemoteNetId = '172.17.176.49.1.1'.
Будем читать бинарные данные, то есть числа в виде потока байтов. Поэтому при
открытии файла необходимо установить флаг бинарного режима чтения nMode := ... FOPEN_MODEBINARY. Кстати, читать можно и блоками по несколько килобайт за раз, но в данном
случае так проще сохранять числа в виде текста.
В остальном все очень просто: открываем, читаем, обрабатываем-конвертируем и
сохраняем. Преобразование значения байта как числа из диапазона 0..255 в
текстовый вид делается в строке:
tmpStr := CONCAT(BYTE_TO_STRING(buf), '$r$n');
... а в конце добавляем символ '$r$n' — перевод каретки CRLF, таким
образом выстраивая числа в столбик. Позднее, я засуну эти случайные числа в
Эксель для анализа.
Набрав достаточное количество чисел, стоит вежливо остановить процесс через
принудительную установку переменной RUN в значение FALSE. Резкая
остановка работы программы, чревато тем, что на приемной стороне файл с
результатом останется открытым и занятым: ни прочитать, ни удалить. Если такое
произойдет, необходимо на приемной стороне вручную перезапустить системный
сервис TwinCAT System Service или выполнить из командной строки с
привелегиями администратора:
powershell -command "Restart-Service TcSysSrv -Force". Заметьте, какой уровень доверия возникает на двух ПЛК, между которыми
налажен роутинг. Это к вопросу о безопасности и отказоустойчивости по обе
стороны сетевого кабеля.
Анализируем случайные числа
В Юникс системах есть несколько генераторов случайных чисел. Они отличаются
надежностью, скоростью, блокировками, чем-либо еще, поэтому их несколько.
Анализировать можно даже случайные числа, тем более, что они псевдослучайные.
Например, можно посмотреть как числа распределены и устраивает ли это
раработчика, технолога или просто любопытного человека.
Интересно посмотреть как распределяется нагрузка по ядрам. Всего виртуальной
машине выделены два ядра, но не факт, что ядра настоящие: возможно, что и
просто два потока (хост с гипертредингом). Зато видно как нагружен
TcSystemService — системный сервис TwinCAT:
Вместо диспетчера задач здесь используется утилита top или
можно установить более красивый htop:
doas pkg install htop. На
картинке выше используется htop.
No comments
Post a Comment
Note: Only a member of this blog may post a comment.