CODESYS V3.5. Настройка обмена с другими устройствами (Modbus, ОВЕН, OPC и др.)
Добрый день, уважаемые коллеги.
Эта тема предназначена для обсуждения вопросов, связанных с настройкой обмена между контроллерами ОВЕН, программируемыми в среде CODESYS V3.5, и другими устройствами.
Наши контроллеры поддерживают следующие протоколы:
Modbus TCP/RTU/ASCII (Master/Slave) - настройка через нативные компоненты CODESYS, добавляемые в дерево проекта;
Modbus TCP/RTU/ASCII (Master/Slave) - настройка через библиотеку OwenCommunication (расширенный функционал, управление обменом из кода);
OPC UA (Server) - настройка через нативный компонент CODESYS (Символьная конфигурация);
протокол ОВЕН (Master) - настройка через библиотеку OwenNet;
возможна реализация нестандартных протоколов обмена через библиотеку OwenCommunication или стандартные библиотеки CODESYS.
В таблице ниже собрана документация, посвященная организации связи по протоколам Modbus, ОВЕН и нестандартным протоколам, а также опросу контроллеров с помощью OPC-серверов. Каждый документ содержит примеры, доступные для скачивания в формате .projectarchive.
Известные проблемы при обмене по Modbus (для старых контроллеров):
1. В компоненте Modbus RTU Master версии 3.5.7.0 не работает галочка Автопереподключение (Autoreconnect).
Статус: в версии 3.5.11.x галочка работает корректно.
При работе со старой линейкой СПК1хх/СП207 рекомендуется использовать версию компонента (3.5.5.0).
2. В компоненте Modbus TCP Slave Device версии 3.5.2.0 не поддержана работа с битами.
Статус: исправлено в версии компонента 3.5.11.x.
3. В компоненте Modbus RTU Slave Device версии 3.5.5.5 не поддержана работа с битами.
Статус: исправлено в версии компонента 3.5.11.x.
4. Модули МУ110-6У и МУ110-8И в некоторых ситуациях могут переставать отвечать на запросы мастера.
Статус: проблема решена в прошивках модулей версии 2.00. Текущую версию прошивки можно посмотреть в Конфигураторе Mx110.
Статус: проблема решена в прошивках модулей версии 1.08. Текущую версию прошивки можно посмотреть в Конфигураторе Mx110.
6. При использовании Modbus TCP каждое slave-устройство должно иметь уникальный порт. При использовании шлюзов Modbus TCP/RTU, которые используют один порт и разные Unit ID , будет производится опрос только первого добавленного устройства.
В документе SPK_Modbus_v.0.8.pdf много раз используется фраза "рисунок хорошо масштабируется", хотя по факту масштабируется плохо (т.е. картинка растровая).
В итоге "Рис. 5.9. Код программы COM2 (CFC)" читается тяжело/плохо.
21.04.2016, 10:49
Евгений Кислов
Цитата:
Сообщение от vladimirisitnikov
В документе SPK_Modbus_v.0.8.pdf много раз используется фраза "рисунок хорошо масштабируется", хотя по факту масштабируется плохо (т.е. картинка растровая).
В итоге "Рис. 5.9. Код программы COM2 (CFC)" читается тяжело/плохо.
Справедливо, с рисунком 5.9 действительно возникли определенные проблемы. Спасибо за замечание.
21.04.2016, 11:09
ASo
Пока вижу ляп на с.38..39 с модбас слэйв.
21.04.2016, 11:20
Евгений Кислов
Цитата:
Сообщение от ASo
Пока вижу ляп на с.38..39 с модбас слэйв.
Спасибо, увидел на с. 39 - вместо Modbus COM написано Device. На с. 38 тоже есть опечатка?
21.04.2016, 12:08
ASo
Скорее на с.40, таблица внизу.
1. Input Registers - это как раз запись из программы и только чтение из сети
Holding Registers - это только чтение из программы и запись/чтение из сети
2. Надо объяснить, что Input Registers отображаются в конфигурации как %QW, а Holding Registers отображаются в конфигурации как %IW.
3. Теперь надо объяснить, что такая конфигурация делает бессмысленным ее применение - не возможно редактировать значение переменной с панели и по сети. Для этого нужна библиотека ModbusSlave.
4. По поводу бибки ModbusSlave - надо придумать пример, как передавать такую переменную из п.3
В принципе, если Вы работаете на Компрессоре, можно встретится на следующей неделе, принесу свой пример.
21.04.2016, 12:21
Евгений Кислов
Цитата:
Сообщение от ASo
Скорее на с.40, таблица внизу.
1. Input Registers - это как раз запись из программы и только чтение из сети
Holding Registers - это только чтение из программы и запись/чтение из сети
2. Надо объяснить, что Input Registers отображаются в конфигурации как %QW, а Holding Registers отображаются в конфигурации как %IW.
3. Теперь надо объяснить, что такая конфигурация делает бессмысленным ее применение - не возможно редактировать значение переменной с панели и по сети. Для этого нужна библиотека ModbusSlave.
4. По поводу бибки ModbusSlave - надо придумать пример, как передавать такую переменную из п.3
В принципе, если Вы работаете на Компрессоре, можно встретится на следующей неделе, принесу свой пример.
Спасибо за замечания, все принял к сведению.
Работаю на компрессоре. Напишите в личку по этому поводу, пожалуйста.
21.04.2016, 12:36
rovki
Вложений: 1
Что бы остальные не поняли ,что вы работаете на компрессоре или тракторе - это территория завода ,где расположен головной офис ОВЕН ;) ,
21.04.2016, 13:02
Сергей0308
Цитата:
Сообщение от rovki
Что бы остальные не поняли ,что вы работаете на компрессоре или тракторе - это территория завода ,где расположен головной офис ОВЕН ;) ,
Не вижу ничего плохого(постыдного) работать на компрессоре или тракторе!!!
21.04.2016, 13:04
rovki
А кто говорил ,что это плохо ,работать на тракторе ???Просто дал пояснение ,что это географическое понятие (место) .
21.04.2016, 13:10
Эдуард_Н
На странице 26 указано выставить время между фреймами 20, а в примере 20-ка только у модулей 16R и 16D у 8А выставлено 200.
21.04.2016, 13:16
Евгений Кислов
Цитата:
Сообщение от Эдуард_Н
На странице 26 указано выставить время между фреймами 20, а в примере 20-ка только у модулей 16R и 16D у 8А выставлено 200.
Спасибо, поправлю.
22.04.2016, 07:38
Эдуард_Н
Вопрос может не по теме, но всё же: У ОВЕНа много руководств по КДС3 и КДС2 и т.д. почему бы ОВЕНу не начать продавать все эти руководства в напечатанном виде, иной раз проще купить чем идти и распечатывать? Тем более если печать будет цветной.
22.04.2016, 07:58
Евгений Кислов
Цитата:
Сообщение от Эдуард_Н
Вопрос может не по теме, но всё же: У ОВЕНа много руководств по КДС3 и КДС2 и т.д. почему бы ОВЕНу не начать продавать все эти руководства в напечатанном виде, иной раз проще купить чем идти и распечатывать? Тем более если печать будет цветной.
Конкретно мне сложно представить в каких случаях это может понадобиться. Электронная документация обладает рядом очевидных преимуществ:
1. Компактность (можно возить с собой на ноутбуке/флэшке/телефоне практически безграничное количество руководств, когда как с бумажными возникнет проблема).
2. Эргономичность (гиперссылки, возможность масштабировать картинки).
3. Доступность для актуализации (документация обновляется).
Я, честно говоря, уже не помню, когда последний раз держал в руках бумажную книгу, при том что постоянно что-то читаю.
22.04.2016, 08:04
Эдуард_Н
Цитата:
Я, честно говоря, уже не помню, когда последний раз держал в руках бумажную книгу, при том что постоянно что-то читаю.
Напрасно, в бумажной книге есть своя прелесть и нечто магическое.
Лично мне пришлось распечатывать несколько руководств по КДС3 для лучшего восприятия.
22.04.2016, 08:10
Евгений Кислов
Цитата:
Сообщение от Эдуард_Н
Напрасно, в бумажной книге есть своя прелесть и нечто магическое.
Лично мне пришлось распечатывать несколько руководств по КДС3 для лучшего восприятия.
Согласен про магичность, про запах типографской краски и т.д., но остальные "конкретные" преимущества все же перевешивают эту эфемерность, на мой взгляд. Впрочем, мы немного отвлеклись от темы - так что, если вы не против, давайте на этом закончим дискуссию о печатной продукции.
22.04.2016, 09:31
Евгений Кислов
Обновление документа до версии 0.81
Поскольку ошибка в описании input и holding регистров, указанная вчера ASo, является принципиальной, документ обновлен до версии 0.81. Все остальные замечания также были отработаны.
27.04.2016, 13:55
жекон
Можно было бы добавить примеры работы с девайсами других производителей
28.04.2016, 01:31
Александр Приходько
Цитата:
Сообщение от жекон
Можно было бы добавить примеры работы с девайсами других производителей
Принцип не изменится. Стандартные средства CODESYS описаны. А особенности чужого оборудования описывать в нашу задачу не входило.
Если будет сильно востребовано, подумаем. Предлагайте примеры.
28.04.2016, 01:36
Александр Приходько
В целом хотелось бы понять документ понятен? Полезен? На сколько удобен такой принцип подачи материала? Остаются ли еще вопросы после прочтения?
04.05.2016, 02:41
Александр Приходько
Цитата:
Сообщение от capzap
1) забавно читается, что к недостаткам относится навыки программирования и знание работы интерфейсов
2) по поводуна этот протокол распространяются те же правила, нумерация адресов слейвов помещается в размерность байта, так что ограничение имеется, да и с мастерами тоже, всё зависит сколько клиентов может одновременно подключиться к слейву
capzap, Вы прекрасно знаете что большинство "программистов" это электронщики, КИПовцы и выходцы из других сфер. Многие о протоколах мало чего знают, еще больше не понимают как это работает на низком уровне. Вот поэтому мы стремимся упростить и работу с контроллерами. Это поможет нам привлекать людей разного уровня подготовки с разными знаниями. Возможно этот человек не понимает в протоколах, но отличный технолог. Для него глубокие познания в программировании не так важны и писать обмен на ассемблере ему не надо.. ) С помощью шаблонов он за 2 минуты осилит всю конфигурацию и дальше будет рисовать в CFC.
По второму замечанию акцент делался на то, что в RTU есть физические ограничения самой линии RS. Т.е. если надо подключить более 32 устройств нужен повторитель интерфейса. В TCP такого ограничения нет. Но верхний потолок действительно есть и он равен 255. При этом CODESYS крайние адреса 254, 255 не дает использовать. 0-адрес широковещательной рассылки.
Евгений в заслуженном отпуске. Когда появится, внесем уточнения.
05.05.2016, 06:19
жекон
Вложений: 1
Нарисовал программу опроса как в примере
PHP код:
com_2(enable:=TRUE,PortNum:=3,PortBaudrate:=19200,Port_Mode:=2,Port_ModeOn:=TRUE,Port_closeon:=FALSE);//Открытие портa CASE step OF 0://Опрос модуля МК110-4ДН4Р(1)(адресс 8) MK110_4dn_4R_inputs1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=8, TimeOut:=T#500MS); IF MK110_4dn_4R_inputs1.done THEN IF MK110_4dn_4R_inputs1.wErrCode=0 THEN dout1:=MK110_4dn_4R_inputs1.inp1; dout2:=MK110_4dn_4R_inputs1.inp2; dout3:=MK110_4dn_4R_inputs1.inp3; dout4:=MK110_4dn_4R_inputs1.inp4; END_IF; MK110_4dn_4R_inputs1.Enabl:=FALSE;step:=1; END_IF 1://Запись в модуль МК110-4ДН4Р(1)(адресс 8) MK110_4dn_4R_outs1(Handle:=com_2.Handle, Enabl:=com_2.Done AND com_2.ErrCode=0, Addr:=8, out1:=din1,out2:=din2,out3:=din3,out4:=din4,TimeOut:=MK110_4dn_4R_inputs1.TimeOut); IF MK110_4dn_4R_outs1.done THEN MK110_4dn_4R_outs1.Enabl:=FALSE;step:=2; END_IF 2://Опрос модуля МК110-4K.4Р(адресс 16) MK110_4K_4R_inputs1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=16, TimeOut:=T#500MS); IF MK110_4K_4R_inputs1.done THEN IF MK110_4K_4R_inputs1.wErrCode=0 THEN dout5:=MK110_4K_4R_inputs1.inp1; dout6:=MK110_4K_4R_inputs1.inp2; dout7:=MK110_4K_4R_inputs1.inp3; dout8:=MK110_4K_4R_inputs1.inp4 ;END_IF MK110_4K_4R_inputs1.Enabl:=FALSE;step:=3; END_IF 3://Запись в модуль МК110-4K.4Р(адресс 16) MK110_4K_4R_outs1(Handle:=com_2.Handle, Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=16, out1:=din5, out2:=din6, out3:=din7, out4:=din8,TimeOut:=MK110_4K_4R_inputs1.TimeOut); IF MK110_4K_4R_outs1.done THEN MK110_4K_4R_outs1.Enabl:=FALSE;step:=4; END_IF 4://Опрос модуля МВ110-8ДФ(адресс 24) MV110_8D_inputs1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=24,TimeOut:=T#500MS); IF MV110_8D_inputs1.done THEN IF MV110_8D_inputs1.wErrCode=0 THEN dout9:=MV110_8D_inputs1.inp1; dout10:=MV110_8D_inputs1.inp2; dout11:=MV110_8D_inputs1.inp3; dout12:=MV110_8D_inputs1.inp4; dout13:=MV110_8D_inputs1.inp5; dout14:=MV110_8D_inputs1.inp6; dout15:=MV110_8D_inputs1.inp7; dout16:=MV110_8D_inputs1.inp8; END_IF MV110_8D_inputs1.Enabl:=FALSE;step:=5; END_IF 5://Опрос модуля МВ110-8А(адресс 32) MV110_8A_inputs1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=32,TimeOut:=T#500MS); IF MV110_8A_inputs1.done THEN IF MV110_8A_inputs1.wErrCode=0 THEN aout1:=MV110_8A_inputs1.inp1; aout2:=MV110_8A_inputs1.inp2; aout3:=MV110_8A_inputs1.inp3; aout4:=MV110_8A_inputs1.inp4; aout5:=MV110_8A_inputs1.inp5; aout6:=MV110_8A_inputs1.inp6; aout7:=MV110_8A_inputs1.inp7; aout8:=MV110_8A_inputs1.inp8; END_IF MV110_8A_inputs1.Enabl:=FALSE;step:=6; END_IF 6://Запись в модуль МУ110-8Р(адресс 40) MY110_8R_outs1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=40,TimeOut:=T#500MS, out1:=din9, out2:=din10, out3:=din11, out4:=din12, out5:=din13, out6:=din14, out7:=din15, out8:=din16); IF MY110_8R_outs1.done THEN MY110_8R_outs1.Enabl:=FALSE;step:=7; END_IF 7://Чтение ТРМ202(адресс 48) TRM_202_read1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Modd:=, Addr:=48,TimeOut:=T#500MS,ErCL:=,inp1=>aout9,inp2=>,ust1=>aout11, ust2=>,out1=>aout10,out2=>,ges1=>aout12,ges2=>,wErrCode=>,done=>); IF TRM_202_read1.done THEN TRM_202_read1.Enabl:=FALSE;step:=8; END_IF 8://Запись в ТРМ202(адресс 48) TRM_202_write1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Modd:=,Addr:=48, TimeOut:=TRM_202_read1.TimeOut,ust1:=ain1,ust2:=,ges1:=ain2,ges2:=,ErCL:=,wErrCode=>,done=>); IF TRM_202_write1.done THEN TRM_202_write1.Enabl:=FALSE;step:=9;END_IF 9://Чтение АТВ312(адресс 54) ATV312_read1( Handle:=com_2.Handle, Enabl:=com_2.Done AND com_2.ErrCode=0, Modd:= , Addr:=54, TimeOut:=T#500MS, ErCL:= , status=>aout13, freg=>aout14, tok=>aout15, volt=>aout16, narab=>aout17, eror=>aout18, wErrCode=> , done=> ); IF ATV312_read1.done THEN ATV312_read1.Enabl:=FALSE;step:=10;END_IF 10://Запись в АТВ312(адресс 54) ATV312_write1( Handle:=com_2.Handle, Enabl:=com_2.Done AND com_2.ErrCode=0, Modd:= , Addr:=54, TimeOut:=ATV312_read1.TimeOut, fr_w:=ain3, st_w:=ain4, ErCL:= , wErrCode=> , done=> ); IF ATV312_write1.done THEN ATV312_write1.Enabl:=FALSE;step:=11;END_IF 11://Чтение МК110-4ДН4Р(2)(адресс 64) MK110_4dn_4R_inputs2(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=64,TimeOut:=T#500MS); IF MK110_4dn_4R_inputs2.done THEN IF MK110_4dn_4R_inputs2.wErrCode=0 THEN dout17:=MK110_4dn_4R_inputs2.inp1; dout18:=MK110_4dn_4R_inputs2.inp2; dout19:=MK110_4dn_4R_inputs2.inp3; dout20:=MK110_4dn_4R_inputs2.inp4; END_IF; MK110_4dn_4R_inputs2.Enabl:=FALSE;step:=12; END_IF 12://Запись в модуль МК110-4ДН4Р(2)(адресс 64) MK110_4dn_4R_outs2(Handle:=com_2.Handle, Enabl:=com_2.Done AND com_2.ErrCode=0, Addr:=64, out1:=din17,out2:=din18,out3:=din19,out4:=din20,TimeOut:=MK110_4dn_4R_inputs2.TimeOut); IF MK110_4dn_4R_outs2.done THEN MK110_4dn_4R_outs2.Enabl:=FALSE;step:=0; END_IF END_CASE
0://Опрос модуля МК110-4ДН4Р(1)(адресс 8)
MK110_4dn_4R_inputs1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=8,
TimeOut:=T#500MS);
IF MK110_4dn_4R_inputs1.done THEN
IF MK110_4dn_4R_inputs1.wErrCode=0 THEN
dout1:=MK110_4dn_4R_inputs1.inp1;
dout2:=MK110_4dn_4R_inputs1.inp2;
dout3:=MK110_4dn_4R_inputs1.inp3;
dout4:=MK110_4dn_4R_inputs1.inp4;
END_IF; MK110_4dn_4R_inputs1.Enabl:=FALSE;
step:=1;
END_IF
Вы присвоили что-то там входу ФБ. Но пока сам ФБ не вызван, это не имеет никакого значения. Надо делать так:
0://Опрос модуля МК110-4ДН4Р(1)(адресс 8)
MK110_4dn_4R_inputs1(Handle:=com_2.Handle,Enabl:=com_2.Done AND com_2.ErrCode=0,Addr:=8,
TimeOut:=T#500MS);
IF MK110_4dn_4R_inputs1.done THEN
IF MK110_4dn_4R_inputs1.wErrCode=0 THEN
dout1:=MK110_4dn_4R_inputs1.inp1;
dout2:=MK110_4dn_4R_inputs1.inp2;
dout3:=MK110_4dn_4R_inputs1.inp3;
dout4:=MK110_4dn_4R_inputs1.inp4;
END_IF; MK110_4dn_4R_inputs1.Enabl:=FALSE;
step:=1;
END_IF
Вы присвоили что-то там входу ФБ. Но пока сам ФБ не вызван, это не имеет никакого значения. Надо делать так:
Скриншот, приведите, пожалуйста, с которого срисовывали.
05.05.2016, 09:40
Владимир Ситников
Цитата:
Сообщение от Евгений Кислов
Скриншот, приведите, пожалуйста, с которого срисовывали.
Можно сделать так, чтобы с примеров копировать можно было?
Т.е. не картинкой примеры показывать, а текстом.
05.05.2016, 09:48
Евгений Кислов
Цитата:
Сообщение от vladimirisitnikov
Можно сделать так, чтобы с примеров копировать можно было?
Т.е. не картинкой примеры показывать, а текстом.
Копировать текстом можно из выложенных проектов CODESYS - скриншоты снимались именно с них.
05.05.2016, 10:24
Владимир Ситников
Цитата:
Сообщение от Евгений Кислов
Копировать текстом можно из выложенных проектов CODESYS - скриншоты снимались именно с них.
Я прекрасно понимаю, что скриншоты снимались с codesys, и что есть отдельные файлы.
Но вы поймите, что показывать код, с которого нельзя скопировать это ай как нехорошо.
Гораздо удобнее будет, если прямо из документа можно будет скопировать.
Листингов не так много.
А польза следующая:
1) Нашёл в документе раздел -- скопировал, работает. Открывать и ещё раз искать в "спец проекте" уже не нужно.
2) Можно поиском найти фрагмент кода. По картинке, сами знаете, ctrl+f не работает.
3) Шрифты будут выглядеть на порядок лучше, без замыливания, которое дают картинки. Не удивлюсь, если кто-нибудь догадается распечатать этот документ, и как "код-картинкой" будет выглядеть на печати сказать сложно. Вряд ли хорошо.
4) Последовательность действий в духе "стр 76 Добавьте в проект объединение с именем String_Word....Рис. 4.79. Объявление переменных объединения" будет гораздо проще выполнять. Сейчас надо смотреть на картинку и перерисовывать. Если бы можно было скопировать, то было бы гораздо проще (да и ошибок меньше)
Да, для CFC скопировать не получится, но те, кто выбрали CFC сами виноваты. А текстовые примеры очень даже можно и сделать "копируемыми".
05.05.2016, 10:37
Евгений Кислов
Пожелание понятно. Постараюсь реализовать в следующей версии.
05.05.2016, 12:02
ASo
Не проще выложить файлы проекта, дав ссылку в документе?
05.05.2016, 12:11
Евгений Кислов
Цитата:
Сообщение от ASo
Не проще выложить файлы проекта, дав ссылку в документе?
Так сейчас же так и сделано. Или я чего-то не уловил?
05.05.2016, 13:00
Евгений Кислов
Цитата:
Сообщение от capzap
ссылка конечно же есть, только зря Вы её оформили через принятие соглашения, у меня например после этого архив открывается как текст в браузере. :) делов то убрать лишнее в начале ссылки
Присутствие текста соглашения - это требование, предъявляемое к любым доступным для скачивания материалам, тут я ничего не могу поделать. По поводу проблемы с попыткой браузера открыть архив как текстовый файл - честно говоря, такое видел только у IE. Сам я использую Chrome, с ним проблемы возникают крайне редко.
05.05.2016, 13:12
Александр Приходько
Цитата:
Сообщение от Евгений Кислов
Присутствие текста соглашения - это требование, предъявляемое к любым доступным для скачивания материалам, тут я ничего не могу поделать. По поводу проблемы с попыткой браузера открыть архив как текстовый файл - честно говоря, такое видел только у IE. Сам я использую Chrome, с ним проблемы возникают крайне редко.
Такая проблема уже была, поправляли. Пообщаемся с нашими web верстальщиками, возможно просто немного некорректную ссылку в документ положили.
12.05.2016, 11:12
vniko
Документ СПК.Modbus по-моему не просто полезен, но и самый важный при изучении СПК, ведь без способности связи с "внешним миром" СПК не интересен. Выражаю большую признательность автору, очень познавательный документ.
Описки и замечания: (красным выделены описки, в скобках пояснения)
Код:
Стр.7. В сети может присутствовать только одно master-устройство,
которое отсылает и принимает запросы подчиненных slave-устройств.
(т.е. получается, что слэйв отсылает мастеру запросы?)
Стр.7. …, время одного полного цикла опроса может значительно увеличит(ь)ся.
Стр.8. В сети могут также существовать специальные шлюзы (gateway), которые
предоставляют данные устройствам из сети TCP/IP доступ к устройствам, объединенным
последовательной линией связи или ведущему устройству с последовательным интерфейсом
доступ к сети TCP/IP.
Стр.21. Список переменных диагностики приведен в приложении Г.
Стр.28. В переменной MV110_16В_DN.rEAd_1; в переменную MU10_16R.wOut1
Стр.31, 39. Четность (хотелось бы рекомендации);
Стоповые биты (рекомендации 2 стоповых бита при отсутствии контроля четности в примерах не выполняются)
Стр.32. Таймаут отклика (на скриншоте таймаут ответа)
Стр.34. Время цикла (Пропущено определение.
Вот это из FAQ: "Время цикла – частота опроса slave-устройства.
Должно быть равным или кратным времени цикла приложения (см. рис. 11.4).
Также время цикла должно выбираться в зависимости от опрашиваемого устройства – например,
для модулей МВ110.8А время обновления данных одного канала для термопары типа ТХК составляет 0.4 секунды,
соответственно, разумное время цикла в секундах равно произведению 0.4 на число используемых каналов.")
Стр.40. для данного для данного slave-устройства; (- в 2-х местах)
Стр.45. после чего выберите из списку нужную переменную
Стр.55. Рис. 4.43: wPrevDI.0 (исправлено на рис 4.60)
Замечание: Например на рис. 4.54 и 4.56 – разные версии CoDeSys
Стр.63. В этом регистре содержаться значения
Стр. 71. Рис. 4.70. (не объяснена вкладка "ModbusGenericSerialMaster Соотнесение входов/выходов")
Стр.78. В COM-порт добавьте компонент Modbus Slave (Serial Device);
Рис. 4.84. Добавление компонента Modbus Master (Serial Device)
Стр.115. Блоки 8-11. …после чего код статуса декодируется помощью функции
Стр.125. Блок [3.0.1]. …хранится битовая маска состояний входом модуля.
Стр.127. 4. При опросе модулей следует анализировать код возникающих ошибок (выход
wErrCode) (в действительности выход Exception)
Стр. 132. …с помощью любой из функций (см. табл. 2.1) (ссылка некорректна)
Стр.138. Рис. 7.15. Добавление компонента Modbus Master (добавляется версия 3.5.7.0,
которая не рекомендуется из-за того, что Автоперезапуск соединения не работает)
Стр.145. Блок 19. В данном примере задействовано 15 байт буфера (я насчитал 14)
Стр.150. Рис. 8.4. (не объяснена вкладка "ModbusTCPMaster Соотнесение входов/выходов")
Стр.150. на вкладке Конфигурация Modbus (TCP) Master
Стр.150. Таймаут сокета (определение непонятно, слово сокет не определено)
Стр. 153. Рис. 8.9. Добавление компонента Modbus TCP Slave (Slave Device)
Стр.154. Рис. 8.10. Настройки компонента Modbus TCP Slave (Slave Device)
Стр.161. Рис. 8.22. Добавление (Настройка) компонента Modbus (TCP) Slave в проект
Стр.174. Рис. 9.5. Настройки СПК в режиме Modbus Slave (Serial Device)
Стр.175. Рис. 9.6. Наложение областей памяти в Modbus Slave (Serial Device)
Стр.175. Modbus Slave (Serial Device) (путаница в наименовании компонентов)
Стр.175. в каждом из случаев мастер-устройство(м) должно(ы) использоваться подходящие функции Modbus
12.05.2016, 11:19
Евгений Кислов
Цитата:
Сообщение от vniko
Документ СПК.Modbus по-моему не просто полезен, но и самый важный при изучении СПК, ведь без способности связи с "внешним миром" СПК не интересен. Выражаю большую признательность автору, очень познавательный документ.
Описки и замечания: (красным выделены описки, в скобках пояснения)
Код:
Стр.7. В сети может присутствовать только одно master-устройство,
которое отсылает и принимает запросы подчиненных slave-устройств.
(т.е. получается, что слэйв отсылает мастеру запросы?)
Стр.7. …, время одного полного цикла опроса может значительно увеличит(ь)ся.
Стр.8. В сети могут также существовать специальные шлюзы (gateway), которые
предоставляют данные устройствам из сети TCP/IP доступ к устройствам, объединенным
последовательной линией связи или ведущему устройству с последовательным интерфейсом
доступ к сети TCP/IP.
Стр.21. Список переменных диагностики приведен в приложении Г.
Стр.28. В переменной MV110_16В_DN.rEAd_1; в переменную MU10_16R.wOut1
Стр.31, 39. Четность (хотелось бы рекомендации);
Стоповые биты (рекомендации 2 стоповых бита при отсутствии контроля четности в примерах не выполняются)
Стр.32. Таймаут отклика (на скриншоте таймаут ответа)
Стр.34. Время цикла (Пропущено определение.
Вот это из FAQ: "Время цикла – частота опроса slave-устройства.
Должно быть равным или кратным времени цикла приложения (см. рис. 11.4).
Также время цикла должно выбираться в зависимости от опрашиваемого устройства – например,
для модулей МВ110.8А время обновления данных одного канала для термопары типа ТХК составляет 0.4 секунды,
соответственно, разумное время цикла в секундах равно произведению 0.4 на число используемых каналов.")
Стр.40. для данного для данного slave-устройства; (- в 2-х местах)
Стр.45. после чего выберите из списку нужную переменную
Стр.55. Рис. 4.43: wPrevDI.0 (исправлено на рис 4.60)
Замечание: Например на рис. 4.54 и 4.56 – разные версии CoDeSys
Стр.63. В этом регистре содержаться значения
Стр. 71. Рис. 4.70. (не объяснена вкладка "ModbusGenericSerialMaster Соотнесение входов/выходов")
Стр.78. В COM-порт добавьте компонент Modbus Slave (Serial Device);
Рис. 4.84. Добавление компонента Modbus Master (Serial Device)
Стр.115. Блоки 8-11. …после чего код статуса декодируется помощью функции
Стр.125. Блок [3.0.1]. …хранится битовая маска состояний входом модуля.
Стр.127. 4. При опросе модулей следует анализировать код возникающих ошибок (выход
wErrCode) (в действительности выход Exception)
Стр. 132. …с помощью любой из функций (см. табл. 2.1) (ссылка некорректна)
Стр.138. Рис. 7.15. Добавление компонента Modbus Master (добавляется версия 3.5.7.0,
которая не рекомендуется из-за того, что Автоперезапуск соединения не работает)
Стр.145. Блок 19. В данном примере задействовано 15 байт буфера (я насчитал 14)
Стр.150. Рис. 8.4. (не объяснена вкладка "ModbusTCPMaster Соотнесение входов/выходов")
Стр.150. на вкладке Конфигурация Modbus (TCP) Master
Стр.150. Таймаут сокета (определение непонятно, слово сокет не определено)
Стр. 153. Рис. 8.9. Добавление компонента Modbus TCP Slave (Slave Device)
Стр.154. Рис. 8.10. Настройки компонента Modbus TCP Slave (Slave Device)
Стр.161. Рис. 8.22. Добавление (Настройка) компонента Modbus (TCP) Slave в проект
Стр.174. Рис. 9.5. Настройки СПК в режиме Modbus Slave (Serial Device)
Стр.175. Рис. 9.6. Наложение областей памяти в Modbus Slave (Serial Device)
Стр.175. Modbus Slave (Serial Device) (путаница в наименовании компонентов)
Стр.175. в каждом из случаев мастер-устройство(м) должно(ы) использоваться подходящие функции Modbus
Большое спасибо за список ошибок/опечаток, это очень поможет при подготовке релизной версии документа.
12.05.2016, 11:20
vniko
При изучении документа возникли некоторые вопросы: 1. На рисунке 5.9 (стр.89) и рисунке 5.11 (стр.92) показан код программ опроса портов на CFC с использованием библиотеки ModulsOwenLib; на рисунке 5.14 (стр.95) и рисунке 5.16 (стр.98) показан код программ опроса портов на ST с использованием библиотеки ModulsOwenLib . Вопрос: В цикле каждой из задач будет происходить опрос всех входов/выходов или только задействованных? 2. Пример настройки обмена между двумя контроллерами СПК207, один из которых выполняется функцию master (с помощью стандартных средств конфигурирования CODESYS), а другой – slave (с помощью библиотеки ModbusSlave). На стр. 135 создается новый проект CODESYS для СПК207 (master) c программой PLC_PRG на языке CFC. На стр. 141 создается новый проект CODESYS для СПК207 (slave) c программой PLC_PRG на языке CFC. Вопрос: Почему в этом случае нельзя в проект CODESYS, содержащий СПК (master), добавить контроллер СПК (slave)? 3. На рис. 9.6. показано наложение областей памяти в Modbus Serial Device. Вопрос: Как реализовать каналы в этом случае? Допускается ли привязать одновременно и holding регистры и coil (или и input регистры и discrete Inputs) для компонента Modbus Slave (модули ввода-вывода) как показано на рисунке 9.6.?
12.05.2016, 11:31
Евгений Кислов
Цитата:
Сообщение от vniko
При изучении документа возникли некоторые вопросы: 1. На рисунке 5.9 (стр.89) и рисунке 5.11 (стр.92) показан код программ опроса портов на CFC с использованием библиотеки ModulsOwenLib; на рисунке 5.14 (стр.95) и рисунке 5.16 (стр.98) показан код программ опроса портов на ST с использованием библиотеки ModulsOwenLib . Вопрос: В цикле каждой из задач будет происходить опрос всех входов/выходов или только задействованных? 2. Пример настройки обмена между двумя контроллерами СПК207, один из которых выполняется функцию master (с помощью стандартных средств конфигурирования CODESYS), а другой – slave (с помощью библиотеки ModbusSlave). На стр. 135 создается новый проект CODESYS для СПК207 (master) c программой PLC_PRG на языке CFC. На стр. 141 создается новый проект CODESYS для СПК207 (slave) c программой PLC_PRG на языке CFC. Вопрос: Почему в этом случае нельзя в проект CODESYS, содержащий СПК (master), добавить контроллер СПК (slave)? 3. На рис. 9.6. показано наложение областей памяти в Modbus Serial Device. Вопрос: Как реализовать каналы в этом случае? Допускается ли привязать одновременно и holding регистры и coil (или и input регистры и discrete Inputs) для компонента Modbus Slave (модули ввода-вывода) как показано на рисунке 9.6.?
1. Будет происходить опрос всех входов/выходов - такова реализация модулей в библиотеке (используются групповые запросы). 2. Вы совершенно правы - разумеется, так сделать можно, более того, в самом проекте так и сделано. Поправлю. 3. В целом, это зависит от задачи. Одновременная привязка регистров и битов допускается, но мне сложно представить ситуацию, в которой это может реально понадобиться. Ну, предположим, у нас есть некоторое фантастическое мастер-устройство, которое может читать только биты, а писать только регистры - и мы хотим с помощью него работать с неким набором битов (читать/писать). Тогда использование holding регистров/сoil'ов в соответствии с рис 9.6 представляется вполне легитимным.
12.05.2016, 21:19
vniko
Евгений, вот реальный пример одновременного использования регистров и битов:
В модуле ввода с 16 входами первые 8 подключены к BCD переключателю, оставшиеся - к кнопкам и датчику.
То есть, мне удобнее читать регистр (слово 16 бит) для получения числа с BCD переключателя и привязать биты из 2-го байта к дискретным входам.
12.05.2016, 21:37
Евгений Кислов
Цитата:
Сообщение от vniko
Евгений, вот реальный пример одновременного использования регистров и битов:
В модуле ввода с 16 входами первые 8 подключены к BCD переключателю, оставшиеся - к кнопкам и датчику.
То есть, мне удобнее читать регистр (слово 16 бит) для получения числа с BCD переключателя и привязать биты из 2-го байта к дискретным входам.
Да, можно так сделать. На опрос это никак не повлияет, т.е. читать вы в любом случае будете только регистр, но в привязанные BOOL переменные будут копироваться значения соответствующих битов.