Занимаюсь программированием PLC Siemens. Есть такая возможность — передать со SCADA целых 4 КБ данных за один цикл, пусть байтовым массивом — но можно же! А при объёме оперативной памяти 128 КБ и под хранение программы 512 — это ой-ой-ой. Решил заняться этим вопросом, благо рецептурная база в пищёвке — вещь необходимая. Вышел я из отпуска — и понеслась…
Шаг первый: скачал пример. Работает, но выворачивает байты наизнанку. Моторола же ж. Ладно, выкурил учебник по C, пристрелял его к реалиям извращённой логики скрипта. Приходит случайно сгенерированный массив в нужном виде.
Шаг второй: ещё один пример для выборки данных из отданного на растерзание пользователю куска SQL-базы. Скурил Александрийскую библиотеку. Сделал. Выбирает данные, запихивает в сгенерированный массив, затем пишет в тэг по номерам байтов, взятым из номера шага и номера параметра.
Шаг третий: теперь полученный массив надо перевести в должный вид, чтобы булевы переменные стали булевыми. А что вы хотели? Нельзя просто так взять и сразу выдать булевыми: хитрая система всё, что отлично от нуля, считает априори трушным. На каком языке проще всего перебирать два массива в трёх циклах? Конечно же, STL.
Шаг четвертый (стул начал тлеть): два массива перебираются в трёх циклах по типу переменных — переменная времени, булева, real. Всё хорошо, но при переборе массива число итераций не увеличивается, что приводит к падению в стоп. Левый глаз дёргается, правый судорожно читает срач на форуме. Умный человек советует скурить книгу Бергера. Слава ему и честь, указывает главу. Смысл в том, что если ты собираешься вызывать один функциональный блок несколько раз, то тебе не надо ничего делать, но второй адресный регистр забирает компилятор под статпеременные, в которых лежат счётчики итераций. Эту возможность можно отключить только при создании блока. Но после — уже никак не изменить судьбу, быть ему навечно мультиэкземплярным.
Шаг пятый: всё, заработало, перебирает и шуршит. Самое время перебраться с симулятора на реальное железо. Из заказанного шкафа выдирается контроллер — и-и-и… Фейл! Эта фича работает или на старшем поколении, или всего на трёх из младшего по мощности, у которых есть порт Profinet.
Мораль: мануалы курить не надо, их надо читать. И очень внимательно, иначе никаких стульев не напасёшься. А я тем временем жду подходящее железо — буду дальше воевать с немцами…