Страница 3 из 6 ПерваяПервая 12345 ... ПоследняяПоследняя
Показано с 21 по 30 из 52

Тема: Universal Modbus Device или библиотека Modbus.lib?

  1. #21
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,656

    По умолчанию

    Так мы не против , Евгений , только примерчик ваш :

    1: (* функция 16 - запись параметров типа Int (регистр 4) и Real (регистр 6) в прибор с адресом 2 *)
    (*запись в буффер параметра типа INT*)
    Buffer[1] := DINT_TO_BYTE(f1);
    Buffer[0] := DINT_TO_BYTE( SHR(f1,8));
    Buffer[3] := DINT_TO_BYTE( SHR(f1,16));
    Buffer[2] := DINT_TO_BYTE( SHR(f1,24));

    (*запись в буффер параметра типа Float*)
    ptr_f2:=ADR(f2);
    buffer[5] := ptr_f2^;
    ptr_f2:=ptr_f2+1;
    buffer[4] := ptr_f2^;
    ptr_f2:=ptr_f2+1;
    buffer[7] := ptr_f2^;
    ptr_f2:=ptr_f2+1;
    buffer[6] := ptr_f2^;

    send2_modbus(
    Enable:= enabl, (* разрешение работы блока *)
    Mode:=MB_ASCII , (*режим передачи*)
    DevAddr:=2 , (*адрес*)
    FirstAddr:= 4, (*номер регистра*)
    Quantity:= 4, (*количество записываемых регистров*)
    ComHandle:=Settings.Port ,(*номер сом-порта*)
    TimeOut:=TimeOut , (*таймаут T#50ms*)
    Buffer:=Buffer , (* буфер данных *)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err , (* скопировать регистр ошибок *)
    RegCnt=> DataSize); (*кол-во считанных байтов *)
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    master1:=0;(*переходим к выполнению следующего блока*)
    END_IF

    END_CASE

    IF enabl = FALSE THEN
    enabl := TRUE;
    END_IF
    IF err <> 0 THEN
    enabl := FALSE;
    END_IF

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

  2. #22

    По умолчанию

    Эврика! ))

    Спасибо всем за помощь. Евгений прав, буфер не надо каждый цикл переписывать и всё работает ) Хотя да.... писал с вашего примера

  3. #23

    По умолчанию

    modbus.lib да, своеобразная, и в описалове к ней есть пара ошибок (в типах данных), но при должном подходе она работает нормально. В моём случае работает уже 3 года на объекте, полёт нормальный.

    И описания для библиотек вместе (в одном месте!!!)с библиотеками и примерами нормальными не только на форуме должны быть , а на Оф.сайте в соответствующем и !!! легко находимом разделе .
    А то шаришся по форуму , который похож сейчас на птичий базар , только что какашки не летят...
    Щас тема подзатеряется и ... опять тот - же вопрос , те-же вилы,грабли...надоело!
    С этим абсолютно солидарен.
    Последний раз редактировалось Boris_K; 01.02.2017 в 09:54.

  4. #24

    По умолчанию

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

  5. #25

    По умолчанию

    Добрый вечер )

    Мысль переписать по modbus.lib возникла после безуспешной борьбы с панелью СМИ1 через конфигуратор. При передаче по протоколу Modbus-RTU (СМИ1 - slave) на панели иногда гас экран и шла ошибка 81. Через несколько секунд работа панели возобновлялась. Всё происходит случайным образом без какой-либо закономерности. Изменение параметров не помогало. Сейчас переписал всё на modbus.lib. Происходит все тоже самое с небольшим нюансом - в панели при таймауте гаснет экран и включается при остановке программы в ПЛК-100. То есть после нормальной работы в течение 5-30 минут гаснет экран и в цикле идут следующие кейсы с ошибкой 255 до тех пор пока не остановлю программу.

    Код:
    FUNCTION_BLOCK Modbus
    VAR_IN_OUT
    	VesViklNew1,VesViklNew2,Tara:BOOL;
    	BigError:BOOL;
    END_VAR
    VAR_INPUT
    	Ves_Post2,Ves_Post1:REAL;
    END_VAR
    VAR_OUTPUT
    	err:INT;
    	VesVikl_Post1, VesVikl_Post2,VesTenzo: REAL;
    END_VAR
    VAR
    	get1_modbus: MB_RD_HOLD_REGS;    (*функция 03 - чтение параметра типа INT*)
    	send2_modbus: MB_WR_REGS;          (*функция 16 - запись параметров*)
    	com_ready1:BOOL;
    	Settings1:COMSETTINGS;				(* настройки последовательного порта *)
          	com_num1: PORTS;			       (*0 - RS-485, 1 - RS-232*)
    	Buffer: ARRAY[0..255] OF BYTE;		(* байтовый буфер данных *)
    	Buffer_ok: ARRAY[0..255] OF BYTE;
    	Buffer_error: ARRAY[0..255] OF BYTE;
    	TimeOut: TIME:=T#50ms;			(*таймаут*)
    	cmpl:BOOL;
    	rejim, rejimerror :BYTE;
    	DataSize: WORD;
    	TimeOut2 : TON;
    	Send: R_TRIG;
    	ptr:POINTER TO BYTE;
    	COM_SERVICE1: COM_SERVICE;
    	x: REAL;
    	errorcount,errorcount0,errorcount1,errorcount2,errorcount3,errorcount4,errorcount5,errorcount6: BYTE;
    	VesTaraNew, VesTaraOld :REAL;
    END_VAR
    
    ......
    
    1: (* Отправка в СМИ1 значения Ves_Post1*)
    Send.CLK := TRUE;
    Send;
    IF Send.Q = TRUE THEN
    	ptr:=ADR(Ves_Post1);
    	buffer[1]:=ptr^;
    	ptr:=ptr+1;
    	buffer[0]:=ptr^;
    	ptr:=ptr+1;
    	buffer[3]:=ptr^;
    	ptr:=ptr+1;
    	buffer[2]:=ptr^;
    	ptr:=ptr+1;
    END_IF
    
    send2_modbus(
    	Enable:= TRUE,			(* разрешение работы блока *)
    	Mode:=MB_RTU ,		(*режим передачи*)
    	DevAddr:=32 , 				(*адрес*)
    	FirstAddr:= 0, 				(*номер регистра*)
    	Quantity:= 2,   				(*количество записываемых регистров*)
    	ComHandle:=Settings1.Port ,(*номер сом-порта*)
    	TimeOut:=TimeOut ,		(*таймаут T#50ms*)
    	Buffer:=buffer ,			(* буфер данных *)
    	Complete=>cmpl ,		(* скопировать признак завершения операции *)
    	Exception=>err ,			(* скопировать регистр ошибок *)
    	RegCnt=> DataSize);		(*кол-во записанных байтов *)
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
       	IF err = 0 THEN
    		rejim:=100;(*переходим к выполнению следующего блока*)
    	ELSE
    		rejimerror := rejim;
    		rejim := 101;
       END_IF
    END_IF
    
    .......
    
    101:(*При ошибке:*)
    	TimeOut2(IN :=TRUE,PT:=T#50ms);
    	TimeOut2;
    	IF TimeOut2.Q THEN
    		rejim := rejimerror;
    		Send.CLK :=FALSE;
    		Send;
    		TimeOut2.IN :=FALSE;
    		TimeOut2;
    	END_IF
    У кого-нибудь мысли есть, что со СМИ1 происходит в этот момент? Может кто то сталкивался с таким?

    P.S. Все остальные модули ОВЕН работают без вопросов. Проблема только со СМИ1. Панели 2шт. - обе ведут себя одинаково.
    Последний раз редактировалось Атаман; 08.02.2017 в 17:59.

  6. #26

    По умолчанию

    А то что ПЛК посылает в панель правильно отображается ?

  7. #27

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    А то что ПЛК посылает в панель правильно отображается ?
    Да, все правильно отображается до появления ошибки.

  8. #28

    По умолчанию

    Чувствую, что где то рядом, но нет....

    Результаты ниже, может у кого то мысль возникнет )

    На ASCII все прекрасно работает - ошибок 0.
    Оставляю блок, который приводил выше, все остальные опросы убираю. То есть записывает в СМИ1 разные значения в один регистр непрерывно. Работал так пару часов - ошибок 0.
    Как только подключаю весь остальной проект возникает ошибка в этом же блоке, при этом в СМИ1 гаснет экран и обе лампочки. И так остается до тех пор, пока не остановлю программу. В программе выполняется последовательно этот блок. Пробовал на горячую при зависании изменить таймаут между отправкой запроса, изменял до 10 сек, не помогает - экран включается но горят нули и всё равно таймаут. Но! Как только меняю на горячую CASE на другой, экран отвисает и всё работает. Вот этот момент я вообще не пойму. Такое ощущение, что где-то что-то не переключается или не отпускает.
    Тот же проект, но с конфигуратором вместо modbus.lib также дает сотни ошибок таймаута.
    Резистор ставил 100, 120, 620 ОМ, с бубном плясал....

    Вообщем ХЕЛП!

    И да... нужно ли буфер обнулять перед отправкой запроса? И как это делается? Пробовал тупо
    for i:= 1TO255 do
    buffer[i] := 0;
    next_for
    уходит в перезагрузку.
    Последний раз редактировалось Атаман; 10.02.2017 в 16:10.

  9. #29

    По умолчанию

    Атаман, Enable взводицо на один цикл. В твоем случае, например так:

    send2_modbus(
    Enable:= Send.Q,

    Буфер обнулять не надо.

    IF Send.Q = TRUE THEN - масло масляное. Достаточно: IF Send.Q THEN

    50ms - маловато для таймаута, будет многовато ошибок. У меня в проектах 250ms.
    Последний раз редактировалось lazy; 10.02.2017 в 16:33.

  10. #30

    По умолчанию

    lazy, спасибо за наводку! )

    Но только все же Enable:= Send.Q нельзя, так как Send.Q становится FALSE после Complete в другом кейсе.
    Последний раз редактировалось Атаман; 10.02.2017 в 17:32.

Страница 3 из 6 ПерваяПервая 12345 ... ПоследняяПоследняя

Похожие темы

  1. Чтение и запись в Universal Modbus device
    от super100 в разделе ПЛК1хх
    Ответов: 20
    Последнее сообщение: 30.10.2013, 13:18
  2. Адресация Universal Modbus device
    от super100 в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 04.10.2013, 14:05
  3. Universal device MODBUS ???
    от EFrol в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 17.01.2012, 10:43

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •