Снимок.JPG
Там и кнопочка печать есть
Снимок.JPG
Там и кнопочка печать есть
функция Modbus 16 H MB_WR_REGS - библиотека Modbus 3.2.0.
В буфере меняется содержимое, то есть первый запрос в норме,
далее в буфере каша, на выходе ерунда. Дело в задержках может?
send_Many_Parametrs_modbus(
Enable:= enabl AND (NOT cmpEndOperating), (* разрешение работы блока *)
Mode:= MB_RTU, (*режим передачи*)
DevAddr:=2, (*адрес*)
FirstAddr:=50, (*ячейка*)
Quantity:= 1,
ComHandle:= hand,
TimeOut:= TimeOutMy,
Buffer:=Buffer_My, (*Вот здесь косяк выходит*)
Complete => cmpEndOperating,
Exception => ExceptionMy,
RegCnt => Cmt_My
);
Работает
Скрин.png
Sashokxxx, параметр send_Many_Parametrs_modbus.Enable надо после первого вызова сбросить в FALSE. Далее вызывать блок со сброшенным параметром до тех пор, пока Complete будет TRUE. И только потом смотрите буфер.
Согласен
send_Many_Parametrs_modbus(
Enable:= NOT cmpEndOperating, (* разрешение работы блока *)
Mode:= MB_RTU, (*режим передачи*)
DevAddr:=2, (*адрес*)
FirstAddr:=0, (*ячейка*)
Quantity:= 1,
ComHandle:= hand,
TimeOut:= TimeOutMy,
Buffer:=Buffer_My,
Complete => cmpEndOperating,
Exception => ExceptionMy,
RegCnt => Cmt_My
);
Buffer:=Buffer_My - первое, у меня в буфер Buffer_My - записывается, хотя я пишу в Buffer. Это нормально, что пишется в Buffer, а потом изменяется Buffer_My?
Это в принципе не проблема можно сделать так: перед тем как записать снова в Buffer, я пишу нужные данные в мой буфер Buffer_My (Buffer_My_copy:=Buffer_My; - сделал копию, а перед вызовом
send_Many_Parametrs_modbus делаю Buffer_My := Buffer_My_copy; ) Допустим работает, реально обмен идет, на выходе правильное значение.
Но периодически в CodeSys я наблюдаю Exception = 255 (то есть ошибка таймаута) TimeOutMy - делал разный 50 мс сейчас. В конфигураторе 50 мс, на аварию устройство настроено выходить при разрыве связи 5 секунд.
Вопрос почему возникает исключение(где посмотреть)?
И второе, можно ли как то посмотреть исходный код send_Many_Parametrs_modbus (функции библиотеки Modbus.lib) может тогда прояснится что делается с буфером, очевидно что она берет как то указатель на мой буфер и сует туда ответ какой то. Добрые люди поделитесь соображениями!)
Еще немного поразмыслив и порыв форум http://www.owen.ru/forum/showthread.php?t=8556&page=5 нашел что то похожее, начал экспериментировать, действительно, на скорости обмена 9600 появляется ошибка тайм аута, если поменять скорость выше 115200 - я использовал, ошибки нет. Дело в библиотеке. С OwenLib ошибок не возникало. Так что вопрос как отредактировать библиотеку остается открытым, если можно подробнее.??? Так же поделитесь кто чем пользуется для связи НЕ с овеновским оборудованием, у меня 2 устройства в системе сторонние из всего что я нашел - решил что Modbus.lib более менее подходит. Через конфигуратор Codesys возможно получится одно подключить, а вот второе оборудование только через библиотеку, так как там ASCii.
Библиотека открытая, можно открыть ее как обычный проект. Сделать полный доступ для просмотра и редактирования Project -> Object -> Properties -> Full Access.
Буфер передается по ссылке (тип параметра VAR_IN_OUT). Зачем делать копию? Приготовили нужный буфер и передаем его в блок. Используйте конструкцию case.
case step of
0: кладем значение в буфер
step:=2;
1: (*вызываем блок с Enable:= TRUE*)
send_Many_Parametrs_modbus(
Enable:= TRUE, (* разрешение работы блока *)
Mode:= MB_RTU, (*режим передачи*)
DevAddr:=2, (*адрес*)
FirstAddr:=0, (*ячейка*)
Quantity:= 1,
ComHandle:= hand,
TimeOut:= TimeOutMy,
Buffer:=Buffer_My,
Complete => cmpEndOperating,
Exception => ExceptionMy,
RegCnt => Cmt_My
);
send_Many_Parametrs_modbus.Enable:=FALSE; (*изменяем параметр Enable* перед следующим вызовом блока)
step:=2;
2: (*продолжаем вызывать блок, пока не отработает полностью (Complete=TRUE)*)
send_Many_Parametrs_modbus(Buffer:=Buffer_My); (*остальные параметры можно не указывать, т.к. они не изменяются, а буфер надо указывать, иначе компилятор ругается*)
...
step=3;
3:
делаем паузу перед следующим опросом.
end_case
Последний раз редактировалось amn; 26.12.2014 в 13:29.
попробую, а задержку между посылками запроса с Enabl:=true какого порядка, 10мс, 50мс... ? И еще я так то встречал, что можно открыть как проект, может где еще качать такую надо? У меня на диске вот какая ( см. во вложении). Я не понял как ее можно открыть как проект. Может другое расширение должно быть, не подскажите, где тогда взять или у кого есть?
И такой общий вопрос, для поддержания связи мне нужно делать запрос как минимум раз в настроенное в конфигураторе время Аварии ? Если так то и время паузы между посылками может быть таким. Например мне нужно посылать значения раз в секунду, аварию настраиваю на 5 секунд, а паузу между запросами на 1, так я понимаю?
Может кто поделится небольшим проектиком в Codesys3.5?