PDA

Просмотр полной версии : 05 функция modbus



desperadoes
11.02.2014, 18:47
Здравствуйте помогите пожалуйста. Пытаюсь с помощью 05 фкнкции библиотеки modbus записать значение булиевой переменной в другой контроллер.Но не могу понять как задать адрес ячейки в другом контроллере
Код в первом ПЛК (Мастер) (CDS ругается на неверный адрес)
IF port_opened=2 THEN (*Удачно проинициализировали*)
send3_modbus(
Enable:=enabl ,
Mode:=MB_ASCII ,
DevAddr:=1 ,
CoilAddr:=%QX8.1.0.0 , (Здесь адрес задается в WORD ну как задать не знаю)
Value:=TRUE ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );
ПЛК 2(Слейв)

XopHeT
11.02.2014, 19:03
Дык CoilAddr это и есть адрес регистра в другом контроллере. Вы ведь знаете, какой регистр Вам нужно записать? ну и вбейте сюда его номер

desperadoes
11.02.2014, 19:06
Но ведь регистр это 2 байта, а мне надо всего один бит!

BETEP
11.02.2014, 19:12
Но ведь регистр это 2 байта, а мне надо всего один бит!
лучше присядьте понадёжнее :D
http://ru.wikipedia.org/wiki/MODBUS#.D0.97.D0.B0.D0.BF.D0.B8.D1.81.D1.8C_.D0.BE .D0.B4.D0.BD.D0.BE.D0.B3.D0.BE_.D0.B7.D0.BD.D0.B0. D1.87.D0.B5.D0.BD.D0.B8.D1.8F

desperadoes
11.02.2014, 19:35
Круто!!! Только не совсем понятно если надо передать значение REAL это 32 бита это два регистра. Получается 16 функцией передавать несколько регистров? Вопрос как их принимать как REAL? или как 2 регистра? а потом их склеивать?

Валенок
11.02.2014, 21:55
Только не совсем понятно если надо передать значение REAL это 32 бита это два регистра.
Это еще что. Вот строку передать. Прям эту. Это ж сколько битов.

desperadoes
11.02.2014, 23:07
Кстати а кто нибудь пользовался примером с диска по работе с библиотекой Modbus? там везде в начале примера есть такой код:
(*Организуем счетчик, что бы передавать эти данные по сети*)
t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
IF A > 9999 THEN
A := 0;
END_IF
END_IF
Я никак не могу понять что это за счетчик и для чего он нужен? Может кто знает?

capzap
11.02.2014, 23:20
А что комментарий к коду не ясен? Каждый цикл, прибавляется единица к переменной и полученное число может отправиться на другой конец проводов, если того пожелает мастер сети

desperadoes
11.02.2014, 23:36
То есть это необязательный счетчик, и его можно применять при желании, понятно спасибо.Просто меня напугало то, когда я первый раз запустил этот пример в симуляторе, CDS через некоторое время выдал сообщение что сработал таймер сторож из за большого времени цикла и контролер перешел в стоп. Я подумал что это какой то обязательный счетчик, а как он работает непонял.

capzap
11.02.2014, 23:41
Где Ваша логика, как код не имея цикла может докатиться до злой собаки?

desperadoes
11.02.2014, 23:50
Вот и меня это насторожило!

amn
11.02.2014, 23:53
У меня как-то сторожевой таймер сработал в симуляторе. В коде были использованы ФБ библиотеки modbus.lib, забыл их отключить. Циклов в коде не было. При работе не в симуляторе все было нормально.

desperadoes
12.02.2014, 00:03
Понятно Спасибо. Это тоже пример использования библиотеки Modbus.lib. Будем считать что это случайное явление

Валенок
12.02.2014, 00:25
Не случайное. В modbus.lib чистится порт.
Грубо говоря тонкая уязвимость. Слейв, в принципе, может заставить мастера отрезетится.

desperadoes
12.02.2014, 12:20
А это можно как то предупредить?

amn
12.02.2014, 12:32
Можно. При работе с сетью не работать в симуляторе.