PDA

Просмотр полной версии : ПЛК63 Modbus Master



ASo
18.08.2010, 17:30
Столкнулся со следующей проблемой:
При записи значения Float на другой ПЛК63 запись проходит успешно, запрос-ответ (сниффер) корректные, но функция MB_WR_REGS возвращает 255 - ошибка таймаута.
В чем може быть проблема? Такое впечатление, что ф-я не анализирует ответ. Может, необходимо сразу после начала записи по Enable:= TRUE сбросить параметр до установки Complete = TRUE ?

Филоненко Владислав
18.08.2010, 19:04
хотелось бы увидеть код

ASo
18.08.2010, 21:09
Пожалуйста.
Пересылка из VentWater в VentHome - в оперативный параметр.

ASo
03.09.2010, 16:39
Возвращаясь к вопросу, параметр Enable в функциях MODBUS - это "толчек" функции, который говорит ей, что надо начать обработку при данном проходе цикла ПЛК. И затем Enable надо сбросить, ожидая завершения, по прежнему вызывая функцию в цикле ПЛК?

ASo
20.09.2010, 12:09
апну еще раз.
вот совсем простая програмка для тестирования записи по Modbus. значения пишутся, ошибка таймаута - постоянная. в чем дело? что я делаю не правильно?

Филоненко Владислав
20.09.2010, 12:55
апну еще раз.
вот совсем простая програмка для тестирования записи по Modbus. значения пишутся, ошибка таймаута - постоянная. в чем дело? что я делаю не правильно?

А зачем Вы каждый цикл открываете порт?
Плюс, не дождавшись открытия порта, сразу посылаете запрос и больше его никогда не шлете?

ASo
20.09.2010, 13:12
А зачем Вы каждый цикл открываете порт?Даже если считать это ошибкой - это не совсем так, ибо после открытия порта Enable сбрасывается FALSE,


Плюс, не дождавшись открытия порта, сразу посылаете запрос и больше его никогда не шлете?Что значит - не дождавшись открытия - ждем Ready=1
И что значит - больше не шлю - шлю каждые 250мс. Я же говорю - пакеты идут, реле на МДВВ щелкают, но ответ 255 (ошибка таймаута) постоянный.

Филоненко Владислав
20.09.2010, 13:33
Открытие/закрытие порта - операция не мгновенная и т.к.
библиотеку ComService писал не я и как она работает не имею ни малейшего представления, рекомендую вызывать все же 1 раз её. Во избежание.

Далее.
Buffer[0]:= 0;
Buffer[1]:= SHR(Kbd, 2) ; - эти строчки надо вызывать лишь 1 раз пред посылкой, по условию SendReq = TRUE;
а не затирать буфер каждый раз. Этот же буфер используется при приёме, а Вы его портите.

Доренский Алексей
09.10.2010, 12:39
Такая же фигня, только для любого типа переменной.
Один ПЛК63 - мастер, второй ПЛК63 - слэйв.
Трафик по Modbus отслеживаю с компа. Все в порядке - запрос-ответ корректные. Но функция возвращает ошибку таймаута. Если этой же функцией опрашивать что угодно, но не второй ПЛК63(слэйв) - ошибок нет. Причем если слэйв опрашивать с компа - все в порядке, ведь запрос-ответ и были всегда в порядке.
Собственно вопрос: почему MB_RD_HOLD_REGS возвращает отшибку таймауа только при обращении к ПЛК63?

P.S. потратил 2 дня - ПЛК63+ПЛК63 получается фигня.

Филоненко Владислав
09.10.2010, 12:48
см. предидущий пост.
нельзя перетирать(использовать) буфер до окончания транзакции

Доренский Алексей
09.10.2010, 13:15
однако я буфер совершенно не трогаю, и точно в нем ничего не меняю. более того, функция отлично работает при чтении с мв110, частотника Delta Vfd, но только не с плк63. см. предидущий пост.

Различие в параметрах обращения к разным устройствам одной и той же функцией только в сетевом адресе, и номере регистра.

Ответ от слэйва ПЛК63 имеется, такой как надо, но почему-то возникает ошибка таймаута у мастера, хоть лоб разбей, словно биты, посылаемые в ответ слэйвом ПЛК63, чем-то отличаются от битов, посылаемых в ответ другими устройствами. И уж совсем непонятно, что при опросе слэйва через программу терринг модбас слэйв опрашивается без ошибки таймаута (ответ всегда был нормальный).

Может быть это связано с диапазоном адресов регисторов? Например при обращении к МВ110 регист 51, к частотнику 8449, 8448, а при обращении к ПЛК63 - 332-511??

Филоненко Владислав
09.10.2010, 13:51
значит происходит таймаут. а вот почему?
код бы все разъяснил, а то приходится задавать "идиотские" вопросы и строить предположения.
Какие настройки задержки ответа в slave?

Доренский Алексей
09.10.2010, 14:32
Дело в том, что частотник отвечает вообще без задержки. Для этого я его посадил на порт ПЛК63 (1 - 232) через АС3-М-220. Даже если устройства имеют задержку 1 мс, ответ читается нормально.
В программе ненужные места позакомментировал (рабочий вариант, прошу прощения за нагромождение всякой всячины), чтение происходит при значении в CASE ukazatel=2; при ukazatel=1 ничего не делается.

CASE_MAX=3, поэтому досчитав до трех программа натыкается на пустую строку для ukazatel=3, этим обеспечивается псылка запроса только один раз, чтобы я мог проследить на компьютере запрос/ответ. Для примера программа производит единожды опрос МВ110 с адресом 01, маски входов - регистр 51. Все отлично. Но стоит поставить адрес 08, регистр 333 - это ПЛК63 слэйв - как возникает ошибка таймаута.

При чтении МВ110:
000001 17:26:42.800 3A :
000002 17:26:42.800 30 0
000003 17:26:42.816 31 1
000004 17:26:42.816 30 0
000005 17:26:42.816 33 3
000006 17:26:42.816 30 0
000007 17:26:42.816 30 0
000008 17:26:42.816 33 3
000009 17:26:42.816 33 3
000010 17:26:42.816 30 0
000011 17:26:42.816 30 0
000012 17:26:42.816 30 0
000013 17:26:42.816 31 1
000014 17:26:42.816 43 C
000015 17:26:42.816 38 8
000016 17:26:42.832 0D .
000017 17:26:42.832 0A .
000018 17:26:42.832 3A :
000019 17:26:42.832 30 0
000020 17:26:42.832 31 1
000021 17:26:42.832 30 0
000022 17:26:42.832 33 30 30
000023 17:26:42.832 32 2
000024 17:26:42.832 32 2
000025 17:26:42.832 30 0
000026 17:26:42.832 34 4
000027 17:26:42.832 30 0
000028 17:26:42.832 39 9
000029 17:26:42.847 41 A
000030 17:26:42.847 0D .
000031 17:26:42.847 0A .

запрос-ответ нормальные, все работает.
Подставляю адрес 08, регистр 333 - это ПЛК63 слэйв
2:
IF enabl=FALSE AND enabl2=FALSE
THEN
adres:=08;
registr:=333 ;
colreg:=1;
COM_Port_NUM:=1;
enabl:=TRUE;
END_IF
Получаю:
000001 17:31:42.751 3A :
000002 17:31:42.751 30 0
000003 17:31:42.751 38 8
000004 17:31:42.751 30 0
000005 17:31:42.751 33 3
000006 17:31:42.751 30 0
000007 17:31:42.751 31 1
000008 17:31:42.751 34 4
000009 17:31:42.751 44 D
000010 17:31:42.751 30 0
000011 17:31:42.767 30 0
000012 17:31:42.767 30 0
000013 17:31:42.767 31 1
000014 17:31:42.767 41 A
000015 17:31:42.767 36 6
000016 17:31:42.767 0D .
000017 17:31:42.767 0A .
000018 17:31:42.798 3A :
000019 17:31:42.798 30 0
000020 17:31:42.798 38 8
000021 17:31:42.798 30 0
000022 17:31:42.798 33 3
000023 17:31:42.798 30 0
000024 17:31:42.814 32 2
000025 17:31:42.814 30 0
000026 17:31:42.814 30 0
000027 17:31:42.814 30 0
000028 17:31:42.814 31 1
000029 17:31:42.814 46 F
000030 17:31:42.814 33 3
000031 17:31:42.814 0D .
000032 17:31:42.814 0A .
В итоге функция выдала ошибку таймаута.

14D - это 333 в десятичной


Через терринг модбас спрашиваю:
Request
:0803014D0001A6

Response
:0803020001F3

Все нормально, ошибки нет.

И в том и в другом случае - ответы верные, но терринг модбас не дает ошибки таймауте, а функция ПЛК - дает.
Голову сломал уже, не пойму почему?

Доренский Алексей
09.10.2010, 14:34
код в приложении:

ASo
09.10.2010, 17:17
Привожу работающий пример записи (чтение не делал) 63 -> 63


PROGRAM SendOutdoor
VAR
SendModbus1: MB_WR_REGS;
SendModbus2: MB_WR_SNG_REG;
ES: BOOL:= TRUE;
TimeOut: TIME:= T#50ms;
Buffer: ARRAY[0..255] OF BYTE;
OutdoorPtr: POINTER TO BYTE;
ErrorSend1: ARRAY[2..5] OF BYTE;
ErrorSend2: ARRAY[2..5] OF BYTE;
Temp: BOOL:= TRUE;
Addr: BYTE:= 2;
EndSendStored: BOOL;
HavePause:TON;
END_VAR

IF ComPortState = 2 THEN
IF Temp THEN
IF ES THEN
OutdoorPtr:= ADR(Outdoor);
Buffer[1]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[0]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[3]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[2]:= OutdoorPtr^;
END_IF
SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= Addr,
FirstAddr:= 148,
Quantity:= 2,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
ES:= FALSE;
IF SendModbus1.Complete THEN
EndSendStored:=TRUE;
ErrorSend1[Addr]:= SendModbus1.Exception;
END_IF
HavePause(IN:= EndSendStored,PT:=T#250ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
Addr:= Addr+1;
END_IF
IF Addr = 6 THEN
Addr:= 2;
Temp:= FALSE;
END_IF
ELSE
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= Addr,
RegAddr:= 346,
Value:= BOOL_TO_WORD(Summer)+1,
ComHandle:= Settings.Port,
TimeOut:= Timeout);
ES:= FALSE;
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[Addr]:= SendModbus2.Exception;
END_IF
HavePause(IN:= EndSendStored,PT:=T#250ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
Addr:= Addr+1;
END_IF
IF Addr = 6 THEN
Addr:= 2;
Temp:= TRUE;
END_IF
END_IF
END_IF

После вызова ф-ии надо сбросить Enable, чтобы тать ей работать.
Проверку выходных переменных стОит делать так, иначе у меня были проблемы.

Доренский Алексей
09.10.2010, 17:30
с записью вроде проблем нет. флаг разрешения необязательно убирать сразу после вызова функции, у меня и с установленным флагом все работает, убираю только когда функция завершила работу.

ASo
09.10.2010, 17:38
тем не менее снимите - чтобы начать отсчет тайм-аута(?).

Филоненко Владислав
09.10.2010, 20:31
Итак 798-767=31. Уже 31 миллисекунда между последним байтом запроса и 1-м байтом ответа.
А общая пауза между концом запроса и концом ответа составляет
814-767=47 мс.
+ задержки в мастере.
Соответственно повторяю вопрос, какая задержка между запросом и ответом выставлена в slave? В ПЛК63, который работает как slave!

Доренский Алексей
11.10.2010, 05:19
Прошу прощения что сразу не ответил на ваш вопрос. 30ms.

Доренский Алексей
11.10.2010, 05:33
программа для слэйва в приложении. слэйв общается как мастер с двумя модулями мв110 и частотником через порт 232 и преобразователь ас3-м (внутренний интерфейс шкафа автоматизации). через 485 - с мастером (внешний интерфейс).
пробовал уменьшать/увеличивать задержку слэйва, и время таймаута мастера. результат тотже.

Доренский Алексей
11.10.2010, 06:12
пунктирная линия - замкнул интерфейсы на время наладки.

попробовал с компа опрашивать параметры типа реал (термодатчики) через терринг модбас, ответ - нулевой. присоил по умолчанию ненулевое значение, ответ все равно ноль. опрашиваю в этом же контроллере параметры типа байт через этот же терринг модбас - опрашиваются без проблем (но только с компа, если опрашивать со второго плк63 - ошибка таймаута).
сменил прошиву 2.11 обратно на 1.94. теперь и параметры типа байт и параметры реал опрашиваются иногда с ошибкой таймаута. иногда реал как возвращал ноль так и возвращает, а байт - возвращает то что надо. заблокировал в программе слэйва вообще открытие портов и какой либо обмен по внутреннему интерфейсу. результат не поменялся. вообщем паремерты реал я вообще не могу прочитать.

Сделал вообще пустую программу слэйва, назначил две переменные в слоте, одну байт, другую реал. Такая же фигня.


ASo: тем не менее снимите - чтобы начать отсчет тайм-аута(?).
Снимал. Результат тот же.

Филоненко Владислав
11.10.2010, 12:16
Прошу прощения что сразу не ответил на ваш вопрос. 30ms.

Это много. Для межПЛК обмена ставить 0 или 1. Остальные цифры для ПК.

P.S. Если вы в программе открыли порт 0 - 485, и не закрыли его, а сам ПЛК не выключали/перегружали - порт как slave до его закрытия работать не будет. При отладке такой момент надо учитывать.

Доренский Алексей
11.10.2010, 13:27
P.S. Если вы в программе открыли порт 0 - 485, и не закрыли его, а сам ПЛК не выключали/перегружали - порт как slave до его закрытия работать не будет. При отладке такой момент надо учитывать.

Это я знаю. Уже пробывал при открытом порте на слейве чего-нибудь с него прочитать мастером. Естественно ничего не получилось. От того что уменьшил время задержки до нуля - лучше не стало.

Вот только сдается мне что Модбас слэйв на ПЛК63 нифига не работает. Попробую разобраться с библиотеками ОВЕН и связать два ПЛК по нему.

Доренский Алексей
12.10.2010, 06:32
Через протокол ОВЕН переменные типа byte, int считываются нормально. Тип REAL - выдает какие-то огромные непонятные числа. Ну чтож, можно уже обойтись малой кровью, прередавая температуру в целочисленном виде. Хотя бы это заработало у ПЛК63 slave.

Филоненко Владислав
12.10.2010, 10:49
Существует несколько вариантов передачи чисел Float (real) по протоколу ModBus. Я видел 4 варианта.
Формат этот не стандартизирован.
Насколько я понимаю, в библиотеке ModBus.lib нет функции чтения/записи float.
А есть только функция чтения/записи нескольких регистров.
Соответственно функция "расшифровки" и "кодирования" float ложится на пользователя и он должен правильно передавать float в зависимости от того, какой тип кодирования используется в slave.

Доренский Алексей
12.10.2010, 16:29
дело не в фуциях с флоат, дело в плк63 слэйв. с мва8 параметры флот нормально читаются плк63 мастер по любому протоколу, замечаний не обнаружено.

Филоненко Владислав
13.10.2010, 13:15
Для Modbus что байт, что флоат одинаков. Он о сути параметра не знает.

Доренский Алексей
14.10.2010, 13:36
естественно не знает.

Переставил кодесис на по-новее. Заменил все библиотеки на по-новее кроме двух (comservise.lib, Ind_Mode.lib). ПЛК63 стал работать гораздо лучше, снялось куча вопросов. ОВЕН рулит!

Товариши пользователи ПЛК, не забывайте менять библиотеки на те что по-новее!

Shiryaev Oleg
02.01.2014, 17:30
Здравствуйте техническая поддержка!

Ошибка Exception=255 при работе функциональных блоков библиотеки ModBus.lib (режим RTU):
MB_RD_HOLD_REGS – функция 3 (чтение слова),
MB_WR_SNG_REG – функция 6 (запись слова).
Проблема в следующем:
После выполнения ФБ чтения/записи устанавливается бит указывающий на завершение операции Complete, и на выходе Exception появляется ошибка 255 (превышение тайм-аута), при этом команды чтение или запись доходят до slave устройства. И slave устройство отправляет на ПЛК 73 ответ об успехе.
ФБ не отсчитывает время, установленное в параметре TimeOut (например 100мс), а всегда выдерживает паузу 3мс, и естественно отсюда ошибка 255.

Переменная отвечающая за время определения тайм-аута внутри библиотечного ФБ -.RxData.T_FRTU. Если при подключенном контроллере изменить этот параметр с изначального значения 3мс на 100мс, то исключение не возникает. Таймер отвечающий за ожидание тайм-аута - .RxData.tonTimer . Ниже привожу структуру библиотечного ФБ:
11267

Из-за этой проблемы, у меня не получиться организовать алгоритм, выполняемый при отключении Modbus. Также подсчет не доставленных посылок.
С ув. Ширяев Олег

ASo
02.01.2014, 17:37
Повторяю в который раз - примеры в руководстве не правильные.
Дайте блоку поработать.

Shiryaev Oleg
04.01.2014, 14:46
А кто мешает при включении плк, установить нужное время в экземпляре, не в ручную в режиме онлайн,а программно?

Из программы нету доступа к внутренним переменным ФБ


Чтоб бибку не редактировать,хотя она свободно открывается
ModBus.lib не открыть CoDeSysом - она зашифрована.


Биб-ка - рабочая. Если на выезде из гаража все время въезжаете в столб - зачем лезть в двигатель ? Если уж залезли - хоть разберитесь кто за что отвечает. T_FRTU - не отвечает за таймаут.

Потому тогда если TimeOut:=10s, то ошибка появится через 3ms? Это так правильно, так и должно быть?
У Вас есть рабочая библиотека и пример?

ASo
04.01.2014, 15:08
Библиотека - рабочая.
После вызова блока с Enable:= true вызывайте его с Enable:= false до окончания операции обмена с устройством, и только после этого анализируйте ошибку.

capzap
04.01.2014, 15:42
Из программы нету доступа к внутренним переменным ФБ


ModBus.lib не открыть CoDeSysом - она зашифрована.



Потому тогда если TimeOut:=10s, то ошибка появится через 3ms? Это так правильно, так и должно быть?
У Вас есть рабочая библиотека и пример?

Я предлагаю все же слушаться Валенка
:)

и рекомендую фильм посмотреть

Shiryaev Oleg
04.01.2014, 15:43
Версия твоей библиотеки какая? у моей 27.05.09 10:22:38

ASo
04.01.2014, 16:08
Какая разница? Для Вашего примера они все рабочие.

Shiryaev Oleg
04.01.2014, 16:27
ASo, если лень смотреть версию библиотеки, так зачем вообще загрязнять форум?

Shiryaev Oleg
04.01.2014, 17:17
:) ...а бибку которая легко читается я например здесь взял http://www.owen.ru/catalog/67395347

CoDeSys на открытие функции в библиотеки ругается вот-так:
11271

Не взглянуть и не посмотреть как они работают :(
Если на против функции стоит символ X , то эту функцию не раскрыть.

amn
04.01.2014, 17:18
ModBus.lib не открыть CoDeSysом - она зашифрована.

Открываете библиотеку в Кодесис как обычный проект. Кликаете правой кнопкой мыши по нужному функциональному блоку, выбираете "Свойства объекта". Меняете права на полный доступ (нижняя строка). После этого можно редактировать.

Shiryaev Oleg
04.01.2014, 18:34
спасибо!!!

Shiryaev Oleg
04.01.2014, 20:07
Теперь понятно в чем проблема, когда видны внутренности библиотечного ФБ:
T_FRTU: TIME := T#3ms; (* межкадровый интервал режима RTU *)
Он слишком мал для скорости 4800 и 9600 бит/сек.
Вот как он влияет на таймер который отвечает за ошибку 255 (функция MB_UNI_IO):
11272

Длина кадра для скорости 4800бит/сек = 8*(11/4800)=18,3мс (расчет из источника https://sites.google.com/site/fieldbusbook/seti/modbus-rtu-ascii-rus)
На скорости 19200 бит/сек и выше - ФБ, проверил работает.
Для скорости 4800 бит/сек- ФБ начинает работать только если поменять T_FRTU=10ms и выше.

Shiryaev Oleg
07.01.2014, 12:27
Уважаемый Валенок, посмотри пожалуйста весь алгоритм ФБ MB_UNI_IO. Межкадровый интервал в ФБ на самом деле играет роль как отсчет времени длины кадра. T_FRTU подставляется в таймер tonTimer, при получении первого символа кадра, вместо нормального тайм-аута. tonTimer выдает ошибку EXC_TO.
PS
Это все можно увидеть даже из приведенной картинки.

Shiryaev Oleg
07.01.2014, 23:11
Да я ошибся с назначением T_FRTU , это действительно межкадровый интервал. Покопался глубже - залез в функцию MB_RTU_RX, которая накапливает в буфере символы. Когда будет принят очередной символ данных, функция MB_RTU_RX своим выходом активирует таймер tonTimer (строчка 43) с новым временем T_FRTU. Т.о., таймер должен определить, когда наступит конец фрейма (кадра). И этот таймер отвечает за генерацию всех ошибок, которые могут быть (строчка 54)!!!
Для режима RTU расстояние между символами равно 1,5 символов при данной скорости передачи в сети (длина символа/скорость передачи).
1 символ = 11 битам.
Новый фрейм может начаться не ранее 3,5 символов при данной скорости передачи в сети.
T_FRTU>= 3,5 * (длина символа/скорость передачи)
Для режима RTU4800 бит/сек, 8E2
T_FRTU>= 3,5 * (11/ 4800)
T_FRTU>=8,02мс
Неравенство не выполняется! Т.к. фактически T_FRTU =3мс.
На практике подставлял T_FRTU=9мс, таймаута – нет, связь стабильная.
Если не верите, проверти на практике.
Библиотека в том виде какая она есть - НЕ РАБОЧАЯ!
Описание протокола ModbusRTU, где очень популярно расписано:
https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.ksoftware.ru%2Ffiles%2Fbooks% 2FPorts%2FModbus(Rus).Doc&ei=RFDMUtb0MqKK4ASpm4GYBQ&usg=AFQjCNEJH5RD_-ovgNd3W7YxbhP4K7RHkg&bvm=bv.58187178,d.bGE

capzap
07.01.2014, 23:57
мне вот просто распирает от любопытства, какая нужда заставляет работать на таких малых скоростях?

Shiryaev Oleg
09.01.2014, 09:37
А что используешь в качестве slave? Я для отладки использую программу симуляцию ModBus - MODSIM32.
На объекте буду использовать частотные преобразователи, скорость будет 9600 бит/сек, соответстевено пауза между кадрами должна быть не менее 5мс. Последний раз когда был на объекте, частотник на этой скорости помечал пакеты как ошибочные. С новыми параметрами еще не пробовал. Скриншоты позже выложу.

yaroslavcik
08.02.2014, 10:01
здравствуйте!

Помогите новичку!:D

При изучении плк 63, дошел до RS485, нужно связать му110-16р с плк (скорость 9600, №5), понял что связи между устройствами организуется не как например в плк 150, а через ФБ (работаю в CFC). добавил нужные библиотеки,описания к блокам нет и к сожалению ни одного примера на cfc как орагнизовать связь между приборами через 485((.

укажите правильный путь где об том можно узнать по лучше или есть какой пример на cfc?

спасибо!

зы при назначении порта "0" - rs-485 выдает ошибку?!

yaroslavcik
08.02.2014, 12:17
Спасибо, изучаю теперь)

yaroslavcik
11.02.2014, 20:23
привет еще раз!
без проблем ни куда: возник вопрос при подключении датчика давления (4...20мА) подключил по схеме (шунт пока обычный резюк), в инструкции написано что можно подогнать выдаваемое значение под нужный диапазон, в данном случае 0...10атм, где менять диапазон таки и не нашел, датчик выдает тож что то не вразумительное, хотя когда давишь на мембрану, значение изменяется, т.е пропорционально нажатию увеличивается, значит датчик подключен верно.

как его настроить, подскажите?! (в плк100-150 как то все по проще было, этот как то тяжко дается)

yaroslavcik
12.02.2014, 08:28
про LIN_TRAFO понял, указывается входной диапазон 4-20мА и выходной диапазон 0-10атм, только как решить проблему с тем, что значение датчика уходит в "-" (такого не должно быть) - это подбирается шунтом? а для чего делить аналоговый вход на 10 тогда?! или чет не уловил?

p.s. извиняюсь за, возможно глупые вопросы)

petera
12.02.2014, 08:43
про LIN_TRAFO понял, указывается входной диапазон 4-20мА и выходной диапазон 0-10атм, только как решить проблему с тем, что значение датчика уходит в "-" (такого не должно быть)....
Такое может быть, если сигнал от датчика будет меньше 4 мА, например 3,5 мА. В этом случае получится "-". Если такие показания Вас не устраивают, то после LIN_TRAFO нужно поставить оператор LIMIT.

yaroslavcik
12.02.2014, 08:46
лимит - да, так и сделаю! спасибо! толь ко не повлияет ли это на точность измерения?!

yaroslavcik
12.02.2014, 16:32
т.е. сигнал 0...100% это уже и есть значение обведенное в кружек (см. фото)?
тогда еще вопрос, как можно уменьшить количество знаков после запятой?

petera
12.02.2014, 16:42
т.е. сигнал 0...100% это уже и есть значение обведенное в кружек (см. фото)?
тогда еще вопрос, как можно уменьшить количество знаков после запятой?
А зачем уменьшать?

yaroslavcik
12.02.2014, 17:13
что бы не было таких значений, т.к. они будут выводится на экран (см. фото)

при чем,когда датчик показывает "-" или выходит за приделы измерения, конечные значения измерений стопорятся в отображении - этот эффект хорошо наблюдается при уходе в "-" датчика

yaroslavcik
12.02.2014, 19:27
понял, учту!

yaroslavcik
14.02.2014, 12:38
и снова проблема с ST, помогите поправить код в программе: суть - нашел ST код для отправки массива данных с плк63 в модуль му110-16р через rs485, а теперь нужно получит данные с модуля мв110-16д, соединение устанавливается а вот получить через него что то разумное не получается, ( номер устройства 6, 9600, mb-rtu). файл в архиве.

Что делаю не так?

p.s. я так понял, что это на выходе уже будет не массив данных, а 16 отдельных выходов, это так?

Spawn
08.07.2016, 15:37
Не стал плодить темы. Коллеги, доброго времени суток. Подскажите пожалуйста, кто работал с Modbus ASCII на ПЛК63/73? Может кто готовым примером поможет? Ни как не могу увязать два ПЛК73 между собой. По Modbus RTU все прекрасно работает, как только ставлю Mode = MB_ASCII, связь полностью пропадает, и начинают сыпаться 255-ые Exception'ы. В чем может быть подвох? Пробовал и таймауты менять, и 8N1, и 7N1, и 7N2 и т.д и т.п. результат нулевой.

Гарчев Евгений
08.07.2016, 17:25
Здравствуйте!
В конфигурационном слейве ПЛК73 для протокола ModBus ASCII некорректно вычисляется контрольная сумма пакета при ответе (вместо LRC используется CRC). Так что, можно сказать, что ModBus ASCII через конфигурацию не работает.

Spawn
08.07.2016, 23:28
Здравствуйте!
В конфигурационном слейве ПЛК73 для протокола ModBus ASCII некорректно вычисляется контрольная сумма пакета при ответе (вместо LRC используется CRC). Так что, можно сказать, что ModBus ASCII через конфигурацию не работает.

Просто чудесно...

Только почему "ModBus ASCII через конфигурацию не работает."? Разве ПЛК73 слейв как-то по другому может работать?

capzap
09.07.2016, 07:13
Просто чудесно...

Только почему "ModBus ASCII через конфигурацию не работает."? Разве ПЛК73 слейв как-то по другому может работать?
=========>
По Modbus RTU все прекрасно работает

Spawn
09.07.2016, 08:34
=========>

Перефразирую. Разве ПЛК73 слейв (Modbus RTU/ASCII, OWEN, без разницы какой протокол) может работать не через конфигурацию?

Spawn
09.07.2016, 08:46
capzap, вот не лень Вам городьбой сообщений заниматься? Не проще ли составить ответ из одного слова "Да" или "Нет"? И я быстрее получу конкретный ответ на свой вопрос - не высиживая еще цать минут ожидая очередного поста с ответом.

capzap
09.07.2016, 09:24
capzap, вот не лень Вам городьбой сообщений заниматься? Не проще ли составить ответ из одного слова "Да" или "Нет"? И я быстрее получу конкретный ответ на свой вопрос - не высиживая еще цать минут ожидая очередного поста с ответом.

Вам начальник техподдержки сказал что в прошивке для модбасАСКИ есть ошибка расчета контрольной суммы , работать не будет. Остается модбасРТУ через конфигуратор или через библиотеки любой протокол

Spawn
09.07.2016, 09:55
Теперь более чем понятно. Гарчев Евгений, capzap, спасибо большое за помощь.

omelchuk
06.12.2017, 15:14
Переделал блок из примера для опроса модуля МВА8 по протоколу ModBus. Опрашиваю 45 регистров, начиная с 3-го. Поставил дополнительную проверку на количество запрошенных и принятых байт. Худо-бедно, хоть и не очень быстро, но работает.
Добавил блок в проект - засада. Уменьшаю кол-во считываемых регистров до 3-х - работает, начинаю увеличивать - начинаются проблемы. Больше 15- уже полный затык.
Куда копать?

Spawn
28.06.2018, 13:56
Всем доброго времени суток. Возникла проблема с MB_WR_REGS. Не пойму в чем затык: с 15 регистрами ФБ работает нормально, ставлю количество регистров >= 16, начинают сыпаться 254 Exception'ы и значения в слейв перестают записываться. Пробовал "играться" со значениями всевозможных таймаутов - результат нулевой. Связка ПЛК73/GE Fanuc 90-30, протокол Modbus RTU. В чем может быть проблема?

Трофимов Артем
28.06.2018, 16:04
какое время цикла у контроллера?
Фанук нормально опрашивается если закидывать в него 16+ регистров? лог обмена снимали?

Spawn
29.06.2018, 03:05
какое время цикла у контроллера?
В GE Fanuc используется коммуникационный управляющий модуль - время цикла ЦПУ ему безразлично, можно хоть вообще остановить ЦПУ, обмен будет продолжаться.


Фанук нормально опрашивается если закидывать в него 16+ регистров?
В этом-то и заключается моя проблема. У меня мастером является ПЛК73. При количестве регистров для записи меньше 16, все запросы на запись завершаются без ошибок. Как только я ставлю Quantity, например, равное 16, все запросы на запись заканчиваются 254 Exception'ом и по факту значения в регистры ПЛК GE Fanuc 90-30 не пишутся.

"Копаем" дальше...

Скорее всего какое-то ограничение самого ПЛК GE Fanuc 90-30 (коммуникационного модуля), хотя в документации про это ни слова. Будем писать по 15 шт.

Spawn
29.06.2018, 06:51
Артем, проясните, пожалуйста, еще одну ситуацию. Писать группой (более одной 4-х байтовой переменной) в ПЛК73, как я понял, возможности нет?

ASo
29.06.2018, 07:45
Как Вы будете отрабатывать условия на переменную?

Spawn
29.06.2018, 09:41
Aso, не понял Вашего вопроса.

Мне нужно, например, группой передать значения 10-ти регистров из одного ПЛК73 (Master) в другой ПЛК73 (Slave) по Modbus RTU, с использованием ФБ MB_WR_REGS за один раз, т.е., например, FirstAddr := 90, Quantity := 10. Или придется цикл использовать? В РП про групповое чтение по протоколу Modbus RTU более-менее расписано, про групповую запись как-то не очень понятно.

Spawn
29.06.2018, 09:47
Про код знаю, меня больше всего волнует не его расшифровка, а отсутствие GetModbus.Exception = 0.
С чтением все нормально. Проблемы только с записью.

Spawn
29.06.2018, 10:10
Либа стандартная Modbus.lib, та, которая идет на диске вместе с ПЛК73. Изменений в нее никаких не вносилось, и, честно сказать, как в ней образуется 254 Exception я не знаю, еще не озадачивался этим вопросом.

Spawn
29.06.2018, 10:21
А чем пользуетесь, если не секрет?

Трофимов Артем
29.06.2018, 10:57
посмотрел начинку, 254й эксепнш - аппаратная ошибка применения. возникает, когда контроллер пытается отправить в порт данные но... ввиду технических ограничений - не может.
из за того что каждый байт данных разбивается на два байта ASCII символов приходится отправлять в 2 раза больше посылки. к сожалению, это аппаратное ограничение обойти не получится, упираемся в максимальный выделенный размер буфера, на 15 регистров хватает, а на 16й уже нет. Вам придётся ограничиться пачками до 15 регистров. в этом режиме всё должно быть стабильно. либо переходите на RTU и сможете передавать пачки до 30 регистров за раз

Spawn
29.06.2018, 11:11
Так проблема как раз с Modbus RTU.

Трофимов Артем
29.06.2018, 11:43
хм...
тогда видимо придётся оставаться на этом уровне , разбить пулинг данных на шаги и по почереди обрабатывать.
у Вас задача критичная к скорости обмен

Spawn
29.06.2018, 11:53
у Вас задача критичная к скорости обмен
Нет, не критичная. Нужно писать 21 регистр. Думал, что получится разом это делать, но и в 2 подхода вполне приемлемый вариант.

ASo
29.06.2018, 14:06
Aso, не понял Вашего вопроса.

Мне нужно, например, группой передать значения 10-ти регистров из одного ПЛК73 (Master) в другой ПЛК73 (Slave) по Modbus RTU, с использованием ФБ MB_WR_REGS за один раз, т.е., например, FirstAddr := 90, Quantity := 10. Или придется цикл использовать? В РП про групповое чтение по протоколу Modbus RTU более-менее расписано, про групповую запись как-то не очень понятно.

А если в этой группе регистров один выходит за границы, заданные в контроллере - как будем обрабатывать?

ASo
01.07.2018, 07:21
Что за вопрос ? Да ни как. Девайс ответит - таких тут нету. Придецца сначала у дворника поспрашать о жильцах. Вот им и писать.

А в оставшиеся будем писать или нет? Почему?

ASo
01.07.2018, 11:08
Не принят по какой причине?
В ПЛК63/73 есть ограничения на диапазон переменной. Допустим, в запросе записи 2-х переменных все регистры существуют, но значение для регистра А соответствует диапазону, а для регистра Б - не соответствует. Что должен сделать ПЛК?

ASo
01.07.2018, 12:27
Если это вопросу что должен делать слейв - вернуть illegal value.И отбросить все значения?
И зачем такие рискованные операции?

ASo
01.07.2018, 12:44
В том, что не указано, в каком регистре проблемы. А если их 10+?
Понятно, что перед запросом должна быть проверка в программе. Но многие ее делают?

d_dmitry
29.01.2024, 13:14
Потратил сутки на решение такой же проблемы, ошибка 255 при чтении, правил билиотеку Modbus, как советовали ниже, вопрос решился устанвкой минимального времени цикла ПЛК в 20мс, может кому пригодится