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

Тема: Вопрос по библиотеке Modbus.lib

  1. #1

    По умолчанию Вопрос по библиотеке Modbus.lib

    Здравствуйте!

    Решил попробовать эту библиотеку для организации сетевого обмена. Модули у меня МДВВ.
    Подключил два модуля - читать их получается, а вот записать в регистры нет.
    Блок MB_WR_REGS выдает ошибку 3:
    Безымянный.png

    Мой код:
    Раздел описания:
    Код:
    FUNCTION_BLOCK Comm
    VAR_INPUT
    END_VAR
    VAR_OUTPUT
    END_VAR
    VAR
    	ModbusAdrDi11,ModbusAdrDi12: MB_RD_HOLD_REGS;   
           ModbusAdrDo11,ModbusAdrDo12:MB_WR_REGS;
    
    	BufferIN: ARRAY[0..255] OF BYTE;		
            BufferOUT: ARRAY[0..255] OF BYTE;		
         	cmpl: BOOL;
    	port_opened:  BYTE := 0;
    	Init: BOOL;							
    	Settings:COMSETTINGS;			
          	com_num: PORTS:=0;				
    	enabl: BOOL;						
    
    	Error, ErrorDI11,ErrorDO11,ErrorDI12,ErrorDO12: INT;						
    	TimeOut: TIME:=T#100ms;			
    	Exception: BYTE;
    	DataSize: WORD;
    	master1: BYTE:= 1;
    
            WordAdr11,WordAdr12:WORD;
    
    	COM_SERVICE1: COM_SERVICE;
    
    END_VAR
    код:
    Код:
              IF port_opened=0
                  THEN
    		           Settings.Port:=com_num;               
    		           Settings.dwBaudRate:=115200;    
    		           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  );
    
    
               IF COM_SERVICE1.ready THEN  port_opened:=2; END_IF
               IF port_opened=2 THEN 
    
              CASE master1   OF
                         0: 
                              ModbusAdrDi11(
    	                                                 Enable:=enabl ,			
    	                                                 Mode:=MB_RTU ,		
    	                                                 DevAddr:=11 ,			
    	                                                 FirstAddr:=51 ,			
    	                                                 Quantity:=1,			
    	                                                 ComHandle:=Settings.Port , 
    	                                                 TimeOut:=TimeOut , 		
    	                                                 Buffer:=BufferIN ,		
    	                                                 Complete=>cmpl ,		
    	                                                 Exception=>ErrorDI11 ,			
    	                                                 ByteCnt=>DataSize );		
                             
                             IF cmpl 
                                THEN
    	                           IF ErrorDI11=0 
                                          THEN  
    		                              WordAdr11:=BYTE_TO_WORD(BUFFERIN[1]) OR SHL(BYTE_TO_WORD(BUFFERIN[0]),8);
    	                           END_IF
    	                           master1:=1; 
                             END_IF
    
                         1: 
                              ModbusAdrDi12(
    	                                                 Enable:=enabl ,			
    	                                                 Mode:=MB_RTU ,		
    	                                                 DevAddr:=12 ,	
    	                                                 FirstAddr:=51 ,				
    	                                                 Quantity:=1,				
    	                                                 ComHandle:=Settings.Port , 
    	                                                 TimeOut:=TimeOut , 		
    	                                                 Buffer:=BufferIN ,		
    	                                                 Complete=>cmpl ,		
    	                                                 Exception=>ErrorDI12 ,			
    	                                                 ByteCnt=>DataSize );		
                             
                             IF cmpl THEN
    	                                   IF ErrorDI12=0 
                                                   THEN 
    		                                      WordAdr12:=BYTE_TO_WORD(BUFFERIN[1]) OR SHL(BYTE_TO_WORD(BUFFERIN[0]),8);
    	                                   END_IF
    	                  master1:=2; 
                             END_IF
    
                         2: ModbusAdrDO11(
    	                                                  Enable:= enabl,
    	                                                  Mode:= MB_RTU,
    	                                                  DevAddr:= 11,
    	                                                  FirstAddr:= 50,
    	                                                  Quantity:= 1,
    	                                                  ComHandle:= Settings.Port,
    	                                                  TimeOut:= TimeOut,
    	                                                  Buffer:= BufferOUT,
    	                                                  Complete=> cmpl,
    	                                                  Exception=> ErrorDO11,
    	                                                  RegCnt=> DataSize);
                             
                             IF cmpl THEN
                                                      master1:=0; 
                             END_IF
              END_CASE
    
    IF  enabl = FALSE THEN
     	enabl := TRUE;
    END_IF(*
    IF ErrorDI11<> 0 OR ErrorDI12<> 0 OR ErrorDO11<> 0 OR ErrorDO12<> 0 THEN
     	enabl := FALSE;
    END_IF
    *)
    END_IF
    Что я делаю неправильно, и как записать байт в регистр мдвв??
    Объясните пожалуйста зачем в блоке MB_WR_REGS вход buffer имеет тип данных ARRAY[0..255] OF BYTE;
    Последний раз редактировалось a_gricaj; 17.09.2016 в 21:16.

  2. #2

    По умолчанию

    Доброй ночи!
    Попробуйте записать 1000 в регистр 00 (выход1). По-моему 50 регистр - чтение маски выходов.

  3. #3

    По умолчанию

    Цитата Сообщение от KSergey Посмотреть сообщение
    Доброй ночи!
    Попробуйте записать 1000 в регистр 00 (выход1). По-моему 50 регистр - чтение маски выходов.
    Доброй ночи, в мдвв 51 регистр чтение маски входов, а 50 запись маски выходов - ну, вроде так в документации на мдвв.... ща еще раз проверю...

  4. #4

    По умолчанию

    Цитата Сообщение от a_gricaj Посмотреть сообщение
    Доброй ночи, в мдвв 51 регистр чтение маски входов, а 50 запись маски выходов - ну, вроде так в документации на мдвв.... ща еще раз проверю...
    Чуть чуть бред написал так как из документации: "Запись в регистры осуществляется командой 16 (0х10), чтение – командами 03 или 04 (прибор
    поддерживает обе команды)." А регистр 50 - выходы....

  5. #5

    По умолчанию

    Примечания
    1. Запись в регистры осуществляется командой 16 (0х10), чтение – командами 03 или 04 (прибор
    поддерживает обе команды).
    2. Обнуление счетчиков делается записью 0 в регистры хранения результатов счета.
    3. В регистрах битовых масок значений входов и выходов старший бит соответствует входу или выходу с
    наибольшим номером: (бит, равный 1, соответствует состоянию выхода «Включено» и входа «Замкнут»).

    Пункт 3. СОСТОЯНИЕ выхода.
    Всё же попробуйте 00-07.

  6. #6

    По умолчанию

    Безымянный.png
    Я уже не знаю как записывать правильно.... думаю проблема с записью на вход buffer ARRAY[0..255] OF BYTE;
    Последний раз редактировалось a_gricaj; 17.09.2016 в 22:01.

  7. #7

    По умолчанию

    Попробуйте
    BufferOUT[0]:=1;
    BufferOUT[1]:=0;
    Должен первый выход включиться, если 50-й регистр на запись.

  8. #8

    По умолчанию

    Цитата Сообщение от KSergey Посмотреть сообщение
    Попробуйте
    BufferOUT[0]:=1;
    BufferOUT[1]:=0;
    Должен первый выход включиться, если 50-й регистр на запись.
    В таком случае все выходы отключены, Error скакает с 0 на 255 и обратно....

    А 50 точно, вот:
    5.1.2 Работа по протоколу ModBus
    Работа по протоколу ModBus может идти в режимах ASCII или RTU, в зависимости от
    заданного значения параметра Prot.
    Скважность ШИМ записывается в регистры, соответствующие каждому из дискретных ВЭ.
    Запись осуществляется командой 16 (0x10), чтение – командами 3 (0x03) или 4 (0x04). Список
    регистров протокола ModBus приведен в Приложении В (таблица В.4).
    Посылка групповой команды включения/выключения ВЭ осуществляется в регистр с
    номером 50 (0x32). В регистр записывается значение от 0 до 255, каждый бит значения
    соответствует состоянию дискретного ВЭ прибора. Единичное значение бита соответствует
    состоянию «Включено» для ВЭ.
    Последний раз редактировалось a_gricaj; 17.09.2016 в 22:28.

  9. #9

    По умолчанию

    За 50-й извиняюсь.
    Посылка групповой команды включения/выключения ВЭ осуществляется в регистр с
    номером 50 (0x32).
    Как вариант, закрывать блоки после успешного чтения-записи:
    if cmpl then
    ..
    ModbusAdrD...(Enable:=false);
    master1:=..;
    end_if;

  10. #10

    По умолчанию

    Цитата Сообщение от KSergey Посмотреть сообщение
    За 50-й извиняюсь.
    Посылка групповой команды включения/выключения ВЭ осуществляется в регистр с
    номером 50 (0x32).
    Как вариант, закрывать блоки после успешного чтения-записи:
    if cmpl then
    ..
    ModbusAdrD...(Enable:=false);
    master1:=..;
    end_if;
    непомогло, все выходы отключены.....
    вот еще заметил:
    Безымянный.png

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

Похожие темы

  1. Еще раз о библиотеке SysLibSockets
    от dudanov в разделе ПЛК1хх
    Ответов: 52
    Последнее сообщение: 28.01.2015, 15:41
  2. По библиотеке UNM
    от Сергей Мих в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 25.04.2012, 23:06
  3. Вопрос по библиотеке UNM
    от askpify в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 31.10.2009, 23:50
  4. По Овеновской библиотеке PID ?
    от mar154 в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 28.10.2008, 12:32

Ваши права

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