Страница 1 из 1

Modbus TCP Slave Device

СообщениеДобавлено: 22 июн 2019, 15:53
rainproof
Доброго всем время суток!
Вопрос у меня возник следующий - стоит задача сконнектить пром.ПК (со СКАДА на борту) с контроллером М241 по ModbusTCP. Контроллер в этом случае является slave-устройством.
Создал Modbus TCP Slave Device

Изображение

Создал переменную в программе - net_var_1.

Изображение

Функцией 16 (Write Multiple Registers) посредством ModbusPoll производится запись в эту переменную с ПК в контроллер (значение 13 например).

Изображение

при попытке присвоить в программе другое значение этой переменной - ее значение остается тем же (13), даже если я обрываю связь с ModbusPoll.

При попытке прочитать регистры %QW (Input Registers) функцией 3 (Read Input Registers) - ModbusPoll сообщает "Illegal Function"

Изображение

так вот: как же мне все таки прочитать значения переменных из контроллера?
Читаю все мануалы Шнайдера на эту тему, экспериментирую с оборудованием на столе - ничего не получается.
У меня нет другого выхода - задача стоит сконнектить контроллер со СКАДА только по Modbus TCP.

Re: Modbus TCP Slave Device

СообщениеДобавлено: 22 июн 2019, 21:13
GoGo
В OPC переменной скады или в модбуспуле просто укажите адрес ячейки контроллера, в которую хотите что-то писать. В контроллере настраивать slave не нужно.

Re: Modbus TCP Slave Device

СообщениеДобавлено: 23 июн 2019, 08:46
rainproof
адрес ячейки контроллера

а как узнать адрес ячейки контроллера?
и как в модбаспуле это прописать?
указать функцию, например 03, и в качестве номера регистра - указать номер ячейки какой-то конкретной переменной?

например - я извлекаю номер ячейки памяти контроллера с помощью оператора ADR:
adr_test_1 := ADR(test_1);
ячейка : 401D2642

как и что записывать в модбаспул?

почитав еще мануалы - продекларировал переменную:

test_2 AT %MW1 : WORD;

т.е. при объявлении - определил адрес в памяти контроллера.
т.е. сейчас мы имеем переменную типа WORD , расположенную по адресу "1".
мне обращаться какой функцией к ней из модбас пул?
read holding registers? read input registers?
а как записать в нее значение из модбаспул?

UPD. Большое спасибо, GoGo!!
Ваша подсказка - помогла понять, как все реализовано.

я создал три переменные:
Код: выделить все
       
 v_test_1 AT %MW0 : UINT;
 v_test_2 AT %MW1 : UINT;
 v_test_3 AT %MW2 : UINT;


и смог работать с ними функцией Read Holding Registers , Write Multiple Holding Registers.

Проблема решена. Тему можно закрыть.