Работа с JSON в Sysmac

В наших проектах по автоматизации мы часто сталкиваемся интеграцией процесса в вышестоящую систему. Этой системой может быть что угодно вплоть до приложения на мобильном телефоне. Ведь все хотят иметь возможность проверить давления в трубах, перенастроить преобразователь частоты, удаленно включить или выключить свет. Нам в Texenergo нечего скрывать и мы с радостью делаем всё прозрачно. Если через года или два клиент захочет заменить наше мобильное приложение на своё, то ему же должна быть дана такая возможность.

Мы используем контроллеры (особенно NX1P2) производства японской Omron по причине их надёжности и, главное, доступности поддержки со стороны производителя. В любом случае, сначала немного теории. Большинство современных контроллеров имеют более или менее доступный интерфейс для работы на уровне TCP. Всем известный протокол HTTP как раз и строится на базе TCP.

Архитектура достаточно проста и универсальна. Далее мы используем контроллер в качестве сервера. Сначала требуется открыть Socket на стороне контроллера. Далее происходить ряд не очень интересных моментов при соединения как обмен ACK-ами.

При создании сокета, работая достаточно близко к железу, мы должны задать длину принимаемого сообщения. Понятно что в реальной жизни она может каждый раз отличаться. Поэтому зададим что-то с небольшим запасом как переменная RcvSocketDat с типом ARRAY[0..1999] OF BYTE. То есть буфер на приём в размере 2000 байтов. Это 2000 знаков для ASCII. Для данного применения более чем достаточно. При получении команды от человека, сообщение будет сложено именно сюда.

Далее начинается что-то чуть более интересное. Байты байтам, но для обработки команды типа {"light":1} нам было бы удобнее преобразовать данные из буфера в строку. Для этого мы создаём переменную jsonString с типом String[256]. Да, это меньше 2000 байтов выше, но не суть. Потом производим конвертацию - AryByteTo(RcvSocketDat[0], 255, _LOW_HIGH, jsonString) Вот это уже интереснее, что здесь происходит? Первая компонента - RcvSocketDat[0]. Ключевой момент заключается именно в [0], где мы явно указываем на начало в памяти контроллера. Вторая компонента - 255 это число байтов для конвертации. Ну а дальше ну суть важно.

Мы также используем отдельную функцию jsonParse для конвертации строки во что-то более внятное. Это может быть произвольное. В нашем же случае мы просто описываем состояние интересующих параметров программы через отдельный тип.

По логике данного применения, мы проверяем всего одно значение "LightMode" и переключаем что-то внутри контроллера. Этого вполне достаточно для демонстрации концепции.

Помните. Самое главное в том, что это всё реально есть и работает.