Modbus TCP: есть ли лучший способ для случайного чтения регистров один или несколько?
Мы пишем службу Windows для чтения данных из ПЛК с использованием протокола Modbus TCP с интервалом опроса 1 секунда через программирование сокетов в C#. Служба Windows получит случайные регистры ПЛК для считывания значений регистров. Ожидаемые регистры случайным образом, такие как 40150,40250,40270,40320.
Из приведенного выше случая, как создать заголовок запроса Modbus TCP? Мы могли бы найти два возможных пути:
- Используя код функции 3, мы можем прочитать значения регистров в определенном диапазоне, например, от 40150 до 40320, таким образом, мы можем прочитать эти 40150,40250,40270,40320 значений регистров.
- Другой способ - запросить эти 40150, 40250, 40270, 40320 регистров один за другим (это вызовет проблемы с производительностью).
Я что-то упускаю здесь? Есть ли лучший способ для случайного чтения регистров один или несколько?
2 ответа
Есть много частей, которые влияют на конечную скорость чтения данных, например, сколько запросов за цикл может ответить ваш ПЛК, я думаю, что единственное решение, чтобы узнать, какой путь более эффективен, это попробовать оба варианта.
Я также рекомендую вам оценить использование сервера Modbus OPC UA или другого сервера OPC, совместимого с вашим ПЛК, с OPC UA можно считывать непоследовательные позиции памяти в одном запросе, хотя, если вам нужно реализовать его в вашем C # код, вероятно, будет сложнее, чем необработанный Modbus
Типичное серверное программное обеспечение OPC, такое как DASMBTCP от Wonderware, может подойти к этой задаче, пытаясь найти наиболее эффективную комбинацию запросов для получения необходимых данных. Вы можете настроить что-то вроде этого и использовать wireshark, чтобы прослушать пакеты Modbus, чтобы увидеть решения, принимаемые другим программным обеспечением.
Функциональный код 3 из памяти может выдавать только 125 регистров одновременно, поэтому вы можете запросить 40150,40250,40270 вместе, но для 40320 потребуется отдельный запрос.
Если вы обеспокоены тем, что диапазон может не поддерживаться устройством (я сталкивался с устройством, которое поддерживает код функции 3, но только до 60 регистров), тогда вам придется сделать вашу программу адаптивной. Например, создайте код функции 3, и в случае его сбоя пометьте эти регистры как требующие отдельных запросов.
Отвечая на ваш вопрос, вы не упустите смысл, лучшего способа чтения нескольких регистров нет, и ваш подход ограничен только тем, поддерживает ли устройство, с которого вы читаете, этот код функции.