PDA

Просмотр полной версии : Modbus.lib и МДВВ



ПРОЕКТ-П
15.05.2013, 12:25
Здравствуйте.

Прошу подсказать решение следующей проблемы.
Имеется контроллер ПЛК100 к которому необходимо подключить по rs485 МДВВ, МВА8, а также оборудование "умного дома" INSYTE по Modbus. Использовать стандартные средства конфигуратора ПЛК не имеет возможности, так как оборудование INSYTE, а именно модули дискретного ввода-вывода R1000 и R1000D, требуют запросы на чтение (функция 02) и запись (05) с точным указанием количества бит, а именно 1 или 2. В конфигураторе ПЛК чтение и запись возможна только по 8 бит сразу. Было принято решение использовать библиотеку Modbus.lib. При опросе с использованием данной библиотеки отдельно одного регистра каждого прибора - все читается и записывается правильно. При опросе регистров по порядку для каждого прибора начинаются проблемы с приемом данных от МДВВ при чтении входной битовой маски и модулей ввода вывода INSYTE R1000 при чтении состояния дискретных входов. Решил для начала разобраться с проблемой для МДВВ. Оставил в опросе только битовые маски на чтение входов (регистр 51) и запись выходов (регистр 50) МДВВ. На входы МДВВ подключены кнопки. Проблема в следующем: при нажатии кнопок иногда на входе МДВВ появляется число 259 (иногда но редко появлялись другие числа), которое не соответствует нажатой кнопке. Из задействованных 7 входов МДВВ данное число чаще всего выпадает при нажатии кнопок соответствующих входам 6 и 7 (32 и 64), с чем это связано не могу понять. Если этот же МДВВ описать в конфигураторе ПЛК то все прекрасно работает. Если же опрашиваю с помощью Modbus.lib только входную битовую маску, то тоже все правильно работает. При записи выходов и чтении входов начинается вышеописанная проблема. Менял таймауты функциональных блоков на чтение и запись modbus, а также задержки между вызовами функциональных блоков - не помогло. Получается что эта проблема связана с использование библиотеки Modbus.lib, возможно я что-то не так делаю в программе при использовании данной библиотеки.
Помогите пожалуйста решить данную проблему.

Проект программы находиться в прикрепленном файле.

JIexa21
16.05.2013, 08:30
За все время ни разу не понадобилось считать именно 1 бит. Тем более что работа с битами одна из главных задач ПЛК и разобрать хоть весь массив из 250 байт вообще не проблема. Даже работая с сименсами по MPI тоже в панель принимаю тэг байта, а вывожу как байт-номер бита.
Может стоит пересмотреть свои предпочтения в области работы с портами?

ПРОЕКТ-П
16.05.2013, 08:59
Я, честно говоря, сам впервые встретил такие устройства для которых нужно читать или записывать именно 1 или 2 бит.
Не понятен вопрос: "Может стоит пересмотреть свои предпочтения в области работы с портами?"

JIexa21
16.05.2013, 11:09
Ну я про то что в этом проекте читать и писать побайтно.
Разобрать байт побитно легко. Например var.0 - нулевой бит и тд.., т.е. при чтении вообще никаких проблем, а с записью чуть посложнее:
считали байт, установили/сбросили бит, записали байт обратно. Тогда достаточно будет и хардварного modbus. Да и читать и писать группой как-то быстрее и выгоднее...

ПРОЕКТ-П
16.05.2013, 12:11
То что вы предлагаете не работает, я все это проверял. В библиотеке Modbus.lib есть функция записи и чтения бит, где указывается количество бит. Данное решение вроде как подходит, но возникает вышеописанная проблема чтения с некоторых устройств modbus сети. :(

capzap
16.05.2013, 12:57
То что вы предлагаете не работает, я все это проверял. В библиотеке Modbus.lib есть функция записи и чтения бит, где указывается количество бит. Данное решение вроде как подходит, но возникает вышеописанная проблема чтения с некоторых устройств modbus сети. :(

Возможно перед запросом следет чистить буффер, скорее всего там остается мусор

JIexa21
16.05.2013, 15:18
Как не работает???
Я всю жизнь так и делаю - некогда мне с битами разбираться. :)

ПРОЕКТ-П
17.05.2013, 09:51
Как не работает???
Я всю жизнь так и делаю - некогда мне с битами разбираться. :)

Не работает в случае с оборудованием INSYTE. А в других случаях я делаю также как вы и писали.

ПРОЕКТ-П
17.05.2013, 09:55
Возможно перед запросом следует чистить буффер, скорее всего там остается мусор

Смысла чистить буфер нет, так как при запросе на запись МДВВ я зваписываю два байта в буфер их же и отправляю. При чтении читаю два байта (1 регистр), ничего другого не читаю. Мусора не должно быть, только если мусор от самой библиотеки Modbus.lib - что, я думаю, маловероятно.

melky
17.05.2013, 10:23
ПРОЕКТ-П совсем даже не маловероятно. Сам вот сейчас читаю регистры этой библиотекой и наблюдаю ахинею в буфере, даже близко не похожую на правду. Я вижу физически включенные выходы, а значения получаю с неба.
Когда же отлавливаю свои выходы, то в буфере они меняют свое положение, так как две FB из библиотеки RD_COIL и RD_HOLD_REGS при чтении параметра крутят цикл. Достаточно на EN библы поставит R_Trig и понаблюдать на значения буфера и состояние выхода ByteCnt FB.

В чем причина и как лечить пока не понимаю.

capzap
17.05.2013, 11:21
Смысла чистить буфер нет...
...Мусора не должно быть, только если мусор от самой библиотеки Modbus.lib - что, я думаю, маловероятно.

бибка открыта, возьмите и загляните как используется массив

JIexa21
17.05.2013, 15:04
Я бы на всякий случай запихал бы вот это:

write_buffer: ARRAY[0..255] OF BYTE;
read_buffer: ARRAY[0..255] OF BYTE;
read_buffer1: ARRAY[0..255] OF BYTE;
в глобальные переменные - мало ли что там с указателями творится...