Страница 1 из 6 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 52

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

  1. #1

    По умолчанию Universal Modbus Device или библиотека Modbus.lib?

    Коллеги, приветствую!

    Подвернулась задачка с весами Тензо-М. Все бы хорошо, но есть один нюанс. В необходимом нам алгоритме работы этих весов (для тех кто в теме - режим вычитающего дозатора "AL3"), запуск дозирования производится неким битом, который управляется командой 5 протокола Modbus (Write Single Coil). В CoDeSys 2.3, в Modbus-мастере на вкладке "Конфигурация ПЛК" ни в одном из подэлементов ветви Universal Modbus Device нет этой пресловутой команды. Это получается, что нужно применить библиотеку Modbus.lib? В общем-то проблем с этим нет, но тогда прошу подсказать, как при помощи этой библиотеки передать в ведомое устройство число с плавающей точкой командой 16 (Write Multiple Registers)? Главным образом интересует как переформировать число из формата REAL в 4 байта буфера для MB_WR_REGS.
    Заранее спасибо!

  2. #2

    По умолчанию

    в примере кусок по работе с 10 функцией и "как переформировать число из формата REAL в 4 байта буфера для MB_WR_REGS."
    Вложения Вложения

  3. #3

    По умолчанию

    Тоже пробую разобраться с modbus.lib.

    На столе ПЛК-100 + МК110-8ДН-4Р

    Пробую записать 48 регистр, а потом его прочитать. Не получается записать, ошибка сразу же (Err = 255). Конфигуратором пишет, читает. Не вижу затыка, хелп!

    Код:
    PROGRAM PLC_PRG
    VAR
    	get1_modbus: MB_RD_HOLD_REGS;    (*ôóíêöèÿ 03 - ÷òåíèå ïàðàìåòðà òèïà INT*)
    	get2_modbus: MB_RD_INP_REGS;		(*ôóíêöèÿ 04 - ÷òåíèå òðåõ ïàðàìåòðîâ òèïà INT*)
    	get3_modbus: MB_RD_HOLD_REGS;	(*ôóíêöèÿ 03 - ÷òåíèå ïàðàìåòðà òèïà Float*)
    	send2_modbus: MB_WR_REGS;         (*ôóíêöèÿ 6 - çàïèñü ïàðàìåòðîâ*)
    
    	Buffer_out: ARRAY[0..255] OF BYTE;		(* áàéòîâûé áóôåð äàííûõ *)
         	cmpl: BOOL;
    	port_opened:  BYTE := 0;
    	Init: BOOL;								(* ïðèçíàê èíèöèàëèçàöèè ïîëüçîâàòåëüñêîé ïðîãðàììû *)
    	Settings:COMSETTINGS;				(* íàñòðîéêè ïîñëåäîâàòåëüíîãî ïîðòà *)
          	com_num: PORTS:=0;				(*0 - RS-485, 1 - RS-232*)
    	enabl: BOOL:=TRUE;							(*ñîñòîÿíèå ðàáîòû áëîêà*)
    	err: INT;								(*íîìåð îøèáêè*)
    	TimeOut: TIME:=T#50ms;				(*òàéìàóò*)
    	Exception: BYTE;
    	DataSize: WORD;
    	master1: BYTE:= 1;
    	TimeOut2 : TON;
    
    	t: DWORD;						(*ïåðåìåííàÿ äëÿ îðãàíèçàöèè ñ÷åò÷èêà*)
    	A: WORD := 4;					(*ñ÷åò÷èê*)
    	x:WORD;						(*ñ÷èòàííîå çíà÷åíèå*)
    	x1: WORD;						(*ïåðåìåííàÿ äëÿ çàïèñè ïî ñåòè*)
    	x2: WORD;						(*ïåðåìåííàÿ äëÿ çàïèñè ïî ñåòè*)
    	x3: WORD;						(*ïåðåìåííàÿ äëÿ çàïèñè ïî ñåòè*)
    	d:  REAL;						(*ñ÷èòàííîå çíà÷åíèå*)
    	f1:DINT:= 2;
    	ptr_f2:POINTER TO BYTE;
    	ptr_D:POINTER TO BYTE;
    
    	COM_SERVICE1: COM_SERVICE;
    END_VAR
    
    
    (*Óñòàíàâëèâàåì íàñòðîéêè COM-ïîðòà*)
    IF port_opened=0 THEN
    		Settings.Port:=com_num;               (*íîìåð COM-ïîðòà*)
    		Settings.dwBaudRate:=9600;    (*ñêîðîñòü*)
    		Settings.byParity:=0;
    		Settings.dwTimeout:=0;
    		Settings.byStopBits:=0;
    		Settings.dwBufferSize:=0;
    		Settings.dwScan:=0;
    END_IF
    
    COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK  );
    (*Åñëè COM-ïîðò îòêðûò, òî ïåðåõîäèì ê ïðèåìó è ïåðåäà÷è äàííûõ *)
    IF COM_SERVICE1.ready THEN
    	port_opened:=2;
    END_IF
    
    IF port_opened=2 THEN (*Óäà÷íî ïðîèíèöèàëèçèðîâàëè*)
    
    CASE master1 OF
    
    0: (* ôóíêöèÿ 03 èíò  - ÔÁ ñ÷èòûâàåò çíà÷åíèå ïàðàìåòðà  òèïà int èç ïðèáîðà ñ àäðåñîì162 â ðåãèñòð ñ íîìåðîì 48 ïî ïðîòîêîëó Modbus-RTU*)
    get1_modbus(
    	Enable:=enabl ,			(* ðàçðåøåíèå ðàáîòû áëîêà *)
    	Mode:=MB_RTU,		(*ðåæèì ïåðåäà÷è*)
    	DevAddr:=16 ,				(*àäðåñ*)
    	FirstAddr:=48 ,				(*íîìåð ðåãèñòðà*)
    	Quantity:=1,				(*êîëè÷åñòâî ðåãèñòðîâ*)
    	ComHandle:=Settings.Port , (*íîìåð COM-ïîðòà*)
    	TimeOut:=TimeOut , 		(*Òàéìàóò T#50ms*)
    	Buffer:=Buffer_out,			(* áóôåð äàííûõ *)
    	Complete=>cmpl ,		(* ñêîïèðîâàòü ïðèçíàê çàâåðøåíèÿ îïåðàöèè *)
    	Exception=>err ,			(* ñêîïèðîâàòü ðåãèñòð îøèáîê *)
    	ByteCnt=>DataSize );		(*êîë-âî ñ÷èòàííûõ áàéòîâ *)
    (*åñëè óñòàíîâëåí ïðèçíàê çàâåðøåíèÿ îïåðàöèè, òî *)
    IF cmpl THEN
    	IF err=0 THEN (*Åñëè íåò îøèáîê, òî ïîëó÷àåì äàííûå èç áóôåðà òèïà INT*)
    		x:=BYTE_TO_WORD(BUFFER_out[1]) OR SHL(BYTE_TO_WORD(BUFFER_out[0]),8);
    		enabl := FALSE;
    	END_IF
    
    END_IF
    
    1: (* ôóíêöèÿ 16  - çàïèñü ïàðàìåòðîâ òèïà Int (ðåãèñòð 48) ïðèáîð ñ àäðåñîì 16 *)
    (*çàïèñü â áóôôåð ïàðàìåòðà òèïà INT*)
           ptr_f2:=ADR(A);
    	Buffer_out[1]:=ptr_f2^;
    	ptr_f2:=ptr_f2+1;
    	Buffer_out[0]:=ptr_f2^;
    
    send2_modbus(
    	Enable:= enabl,			(* ðàçðåøåíèå ðàáîòû áëîêà *)
    	Mode:=MB_RTU ,		(*ðåæèì ïåðåäà÷è*)
    	DevAddr:=16 , 				(*àäðåñ*)
    	FirstAddr:= 48, 				(*íîìåð ðåãèñòðà*)
    	Quantity:= 1,   				(*êîëè÷åñòâî çàïèñûâàåìûõ ðåãèñòðîâ*)
    	ComHandle:=Settings.Port ,(*íîìåð ñîì-ïîðòà*)
    	TimeOut:=TimeOut ,		(*òàéìàóò T#50ms*)
    	Buffer:=Buffer_out ,			(* áóôåð äàííûõ *)
    	Complete=>cmpl ,		(* ñêîïèðîâàòü ïðèçíàê çàâåðøåíèÿ îïåðàöèè *)
    	Exception=>err ,			(* ñêîïèðîâàòü ðåãèñòð îøèáîê *)
    	RegCnt=> DataSize);		(*êîë-âî ñ÷èòàííûõ áàéòîâ *)
    (*åñëè óñòàíîâëåí ïðèçíàê çàâåðøåíèÿ îïåðàöèè, òî *)
    IF cmpl THEN
      IF err =0 THEN
    	master1:=2;(*ïåðåõîäèì ê âûïîëíåíèþ ñëåäóþùåãî áëîêà*)
    	END_IF
    END_IF
    
    2:
     TimeOut2(IN :=TRUE,PT:=T#5ms);
     TimeOut2;
     IF TimeOut2.Q THEN
    	master1 := 0;
    END_IF
    
    END_CASE
    
    END_IF
    Последний раз редактировалось Атаман; 28.01.2017 в 22:59.

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    а то что не получается записать определяете по ошибке или по физическим выходам, при записи я вобще не анализировал что возвращает функция
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    а то что не получается записать определяете по ошибке или по физическим выходам, при записи я вобще не анализировал что возвращает функция
    Подключил лампочку, поменял регистр на управление реле и убрал проверку на ошибку после send2_modbus. Всё работает.

    Тогда попутный вопрос. Приборы овен в slave ничего не возвращают после получения команды на запись регистров, как в описании протокола модбас сказано?

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    опросите прибор с ПК и сразу станет ясно куда глядеть
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #7

    По умолчанию

    Нет конвертера пк-rs485.

    В протоколе написано:
    "6.12 16 (0x10) Write Multiple registers
    This function code is used to write a block of contiguous registers (1 to 123 registers) in a
    remote device.
    The requested written values are specified in the request data field. Data is packed as two
    bytes per register.
    The normal response returns the function code, starting address, and quantity of registers
    written. "

    Может кто-нибудь проверял вот эти response ОВЕНы отправляют? с какой задержкой и т.п.?

  8. #8

    По умолчанию

    Прочитал комментарии в modbus.lib:


    FUNCTION_BLOCK MB_WR_REGS
    VAR_OUTPUT
    Complete: BOOL; (* если = TRUE, то обмен завершен *)
    Exception: BYTE; (* исключения протокола MODBUS или 0хFF - таймаут *)
    RegCnt: BYTE; (* количество записанных регистров *)

    То есть, если есть исключения, то посылаются они, а если нет то ничего?!
    Приходит один comlete = true, а exception = 255 и regcnt = 0 (
    То есть после записи регистра, обязательно нужно его читать для проверки?
    Последний раз редактировалось Атаман; 29.01.2017 в 10:48.

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

    По умолчанию

    В выше приведенном коде enabl не переключается в true , вообще пример дурацкий , писал видимо студент . Т.к по идее запускается блок при переходе из 0 в 1 и мало запустить , надо и сбросить , т.е вызвать блок с enabl=false .
    А exception = 255 и regcnt = 0 означает что связи нет раб не ответил хозяину - раб не слышит , или не понимает :
    1. Блок МВ110 настроен правильно ?
    2. Com порт тот? Ports=0-485(1),Ports=2-485(2)
    3. Проводки правильно соединены?
    4. Человек , берущий такие задачки должен иметь преобразователь usb-485.

    P.S
    Ха-ха-ха , дошло , как до жирафа :- Батенька (Атаман) , если у вас нет преобразователя usb-485 , то как вы модуль Овен настраивали??? Он из коробочки Модбас не понимает!
    Во-блин дедукция...
    Последний раз редактировалось Sergey666; 29.01.2017 в 11:37.

  10. #10

    По умолчанию

    Цитата Сообщение от Sergey666 Посмотреть сообщение
    В выше приведенном коде enabl не переключается в true , вообще пример дурацкий , писал видимо студент . Т.к по идее запускается блок при переходе из 0 в 1 и мало запустить , надо и сбросить , т.е вызвать блок с enabl=false .
    А exception = 255 и regcnt = 0 означает что связи нет раб не ответил хозяину - раб не слышит , или не понимает :
    1. Блок МВ110 настроен правильно ?
    2. Com порт тот? Ports=0-485(1),Ports=2-485(2)
    3. Проводки правильно соединены?
    4. Человек , берущий такие задачки должен иметь преобразователь usb-485.

    Сергей, я дальше написал ответы на вопросы. Сейчас всё работает, только также в ответ на send_modbus приходит error=255 и regcnt = 0, но регистр при этом записывается! Запихнул блоки из modbus.lib в мой проект для отладки.

    error 255 (EXC_TO) устанавливается в MB_UNI_IO здесь:
    (*кадр принят, контроль CRC*)
    DataSize := DataSize - 2;
    CrcReg := MB_CRC(ADR(DataBuf), DataSize);
    IF DataBuf[DataSize] <> WORD_TO_BYTE(CrcReg) OR
    DataBuf[DataSize + 1] <> WORD_TO_BYTE(SHR(CrcReg, 8)) THEN
    Exception := EXC_TO;
    .....

    то есть что то не то с CRC я так понял?


    добавлено:

    CRC расчетное и в принятом пакете не совпадают. Это почему может быть?
    Последний раз редактировалось Атаман; 29.01.2017 в 12:00.

Страница 1 из 6 123 ... ПоследняяПоследняя

Похожие темы

  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

Ваши права

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