Показано с 1 по 10 из 128

Тема: СПК1хх и Модбас

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #10

    По умолчанию

    Лучше делать программный опрос через библиотеки ModulesOwenLib, Syscom, ComConn, RSMode library
    К тому-же можно обрабатывать коды ошибок с модулей ввода, у меня реализовано отдельной процедурой.
    Пример программы
    (AI_Err_Codes - моя функция, по сути равнозначна стандартной DWORD_TO_INT)
    Программа:

    Код:
    PROGRAM PLC_PRG_RS485
    VAR  
    
    	CurrentModule:INT:=1;
    	CNT:INT:=0; //счетчик, исп-ся для выявления задержек в опросе
    	
    	//установки порта RS485, у СПК110 сдвиг номера на 1: на приборе 1-й, в программе 2-й
    	start:BOOL:=FALSE;	
    	AllowWrite:BOOL:=TRUE;
    	settings:SysCom.COM_Settings;
    	settings2:SysCom.COM_SettingsEx;
    	ComHandle:SysCom.RTS_IEC_HANDLE;
    	res:SysCom.RTS_IEC_RESULT;
    	ret_res: INT;
    
    	conn:ComConn;
    	PortMode:RS_mode;
    	
    	//Модули ввода/вывода
    	Mod1:MV110_8A_inputs;
    	Mod2:MV110_8A_inputs;
    	Mod3:MV110_8A_inputs;
    	Mod4:MY110_8R_outs;
    	Mod5:MY110_8R_outs;
    	Mod6:MK110_8dn_4R_outs; //МУ 8Д4Р, 4 выхода
    	Mod7:MK110_8dn_4R_inputs; //МУ 8Д4Р, 8 входов
    	
    	Mod1_Enabl, Mod2_Enabl, Mod3_Enabl, Mod4_Enabl, Mod5_Enabl, Mod6_Enabl, Mod7_Enabl:BOOL:=FALSE;
    	
    END_VAR
    Код:
    IF Start = FALSE THEN		
    		conn.PortNum:=2;	//установки порта RS485, у СПК110 сдвиг номера на 1, 2-й ком-порт на приборе соответсвует 3-му программному.
    		conn.PortBaudrate:=115200;
    		conn.Port_ModeOn:=TRUE;
    		conn.Port_Mode:=RS_mode.RS_485; // режим RS485
    		conn.Port_CloseOn:=false;
    		conn(enable:= TRUE);
    		IF conn.Done=TRUE THEN
    			ComHandle:=conn.Handle;
    			Start:=TRUE;
    			CurrentModule:=1;
    			CNT:=0;
    			
    			mod1.Addr:=1;
    			mod1.TimeOut:=T#500MS;
    			mod1.Handle:=ComHandle;		
    			
    			mod2.TimeOut:=T#500MS;
    			mod2.Handle:=ComHandle;
    			mod2.Addr:=2;
    			
    			mod3.TimeOut:=T#500MS;
    			mod3.Handle:=ComHandle;
    			mod3.Addr:=3;
    			
    			mod4.TimeOut:=T#500MS;
    			mod4.Handle:=ComHandle;
    			mod4.Addr:=4;
    			
    			mod5.TimeOut:=T#500MS;
    			mod5.Handle:=ComHandle;
    			mod5.Addr:=5;
    			
    			mod6.TimeOut:=T#500MS;
    			mod6.Handle:=ComHandle;
    			mod6.Addr:=6;
    			
    			mod7.TimeOut:=T#500MS;
    			mod7.Handle:=ComHandle;
    			mod7.Addr:=6;
    		END_IF
    END_IF
    
    CASE CurrentModule OF
    	1:	
    		//Опрашиваем модуль МВ8А по адресу 1
    		
    		IF Mod1_Enabl=FALSE THEN
    			Mod1_Enabl:=TRUE;	
    		END_IF
    		mod1(Enabl:=Mod1_Enabl);		
    		IF mod1.done THEN			
    			Mod1_Enabl:=FALSE;
    			mod1(Enabl:=Mod1_Enabl);				
    			CurrentModule:=CurrentModule+1;
    			
    			charr[1].ErrCode:=AI_Err_Codes(mod1.inpExcSCode1);
    			charr[2].ErrCode:=AI_Err_Codes(mod1.inpExcSCode2);
    			charr[3].ErrCode:=AI_Err_Codes(mod1.inpExcSCode3);
    			charr[4].ErrCode:=AI_Err_Codes(mod1.inpExcSCode4);
    			charr[5].ErrCode:=AI_Err_Codes(mod1.inpExcSCode5);
    			charr[6].ErrCode:=AI_Err_Codes(mod1.inpExcSCode6);
    			charr[7].ErrCode:=AI_Err_Codes(mod1.inpExcSCode7);
    			charr[8].ErrCode:=AI_Err_Codes(mod1.inpExcSCode8);
    
    			IF charr[1].ErrCode=0 THEN 
    				charr[1].Value:=mod1.inp1;
    			ELSE
    				charr[1].Value:=0;
    			END_IF	
    		
    			IF charr[2].ErrCode=0 THEN 
    				charr[2].Value:=mod1.inp2;
    			ELSE
    				charr[2].Value:=0;
    			END_IF
    			
    			IF charr[3].ErrCode=0 THEN 
    				charr[3].Value:=mod1.inp3;
    			ELSE
    				charr[3].Value:=0;
    			END_IF
    			
    			IF charr[4].ErrCode=0 THEN 
    				charr[4].Value:=mod1.inp4;
    			ELSE
    				charr[4].Value:=0;
    			END_IF
    			
    			IF charr[5].ErrCode=0 THEN 
    				charr[5].Value:=mod1.inp5;
    			ELSE
    				charr[5].Value:=0;
    			END_IF
    			
    			IF charr[6].ErrCode=0 THEN 
    				charr[6].Value:=mod1.inp6;
    			ELSE
    				charr[6].Value:=0;
    			END_IF
    			
    			IF charr[7].ErrCode=0 THEN 
    				charr[7].Value:=mod1.inp7;
    			ELSE
    				charr[7].Value:=0;
    			END_IF
    			
    			IF charr[8].ErrCode=0 THEN 
    				charr[8].Value:=mod1.inp8;
    			ELSE
    				charr[8].Value:=0;
    			END_IF
    					
    			CNT:=0;
    		ELSE
    			CNT:=CNT+1;
    		END_IF			
    	2:
    		//Опрашиваем модуль МВ8А по адресу 2
    		
    		IF Mod2_Enabl=FALSE THEN
    			Mod2_Enabl:=TRUE;	
    		END_IF
    		mod2(Enabl:=Mod2_Enabl);		
    		IF mod2.done  THEN			
    			Mod2_Enabl:=FALSE;
    			mod2(Enabl:=Mod2_Enabl);				
    			CurrentModule:=CurrentModule+1;
    			
    			charr[9].ErrCode:=AI_Err_Codes(mod2.inpExcSCode1);
    			charr[10].ErrCode:=AI_Err_Codes(mod2.inpExcSCode2);
    			charr[11].ErrCode:=AI_Err_Codes(mod2.inpExcSCode3);
    			charr[12].ErrCode:=AI_Err_Codes(mod2.inpExcSCode4);
    			charr[13].ErrCode:=AI_Err_Codes(mod2.inpExcSCode5);
    			charr[14].ErrCode:=AI_Err_Codes(mod2.inpExcSCode6);
    			charr[15].ErrCode:=AI_Err_Codes(mod2.inpExcSCode7);
    			charr[16].ErrCode:=AI_Err_Codes(mod2.inpExcSCode8);
    			
    			IF charr[9].ErrCode=0 THEN 
    				charr[9].Value:=mod2.inp1;
    			ELSE
    				charr[9].Value:=0;
    			END_IF
    			
    			IF charr[10].ErrCode=0 THEN 
    				charr[10].Value:=mod2.inp2;
    			ELSE
    				charr[10].Value:=0;
    			END_IF
    			
    			IF charr[11].ErrCode=0 THEN 
    				charr[11].Value:=mod2.inp3;
    			ELSE
    				charr[11].Value:=0;
    			END_IF	
    			
    			IF charr[12].ErrCode=0 THEN 
    				charr[12].Value:=mod2.inp4;
    			ELSE
    				charr[12].Value:=0;
    			END_IF
    			
    			IF charr[13].ErrCode=0 THEN 
    				charr[13].Value:=mod2.inp5;
    			ELSE
    				charr[13].Value:=0;
    			END_IF
    			
    			IF charr[14].ErrCode=0 THEN 
    				charr[14].Value:=mod2.inp6;
    			ELSE
    				charr[14].Value:=0;
    			END_IF
    			
    			IF charr[15].ErrCode=0 THEN 
    				charr[15].Value:=mod2.inp7;
    			ELSE
    				charr[15].Value:=0;
    			END_IF
    			
    			IF charr[16].ErrCode=0 THEN 
    				charr[16].Value:=mod2.inp8;
    			ELSE
    				charr[16].Value:=0;
    			END_IF
    		
    			CNT:=0;
    		ELSE
    			CNT:=CNT+1;
    		END_IF 
    	3:
    		//Опрашиваем модуль МВ8А по адресу 3
    		
    		IF Mod3_Enabl=FALSE THEN
    			Mod3_Enabl:=TRUE;	
    		END_IF
    		mod3(Enabl:=Mod3_Enabl);		
    		IF mod3.done  THEN			
    			Mod3_Enabl:=FALSE;
    			mod3(Enabl:=Mod3_Enabl);				
    			CurrentModule:=CurrentModule+1;
    			charr[17].ErrCode:=AI_Err_Codes(mod3.inpExcSCode1);
    			charr[18].ErrCode:=AI_Err_Codes(mod3.inpExcSCode2);
    			charr[19].ErrCode:=AI_Err_Codes(mod3.inpExcSCode3);
    			charr[20].ErrCode:=AI_Err_Codes(mod3.inpExcSCode4);
    			charr[21].ErrCode:=AI_Err_Codes(mod3.inpExcSCode5);
    			charr[22].ErrCode:=AI_Err_Codes(mod3.inpExcSCode6);
    			charr[23].ErrCode:=AI_Err_Codes(mod3.inpExcSCode7);
    			charr[24].ErrCode:=AI_Err_Codes(mod3.inpExcSCode8);
    			
    			IF charr[17].ErrCode=0 THEN 
    				charr[17].Value:=mod3.inp1;
    			ELSE
    				charr[17].Value:=0;
    			END_IF
    			
    			IF charr[18].ErrCode=0 THEN 
    				charr[18].Value:=mod3.inp2;
    			ELSE
    				charr[18].Value:=0;
    			END_IF
    			
    			IF charr[19].ErrCode=0 THEN 
    				charr[19].Value:=mod3.inp3;
    			ELSE
    				charr[19].Value:=0;
    			END_IF	
    			
    			IF charr[20].ErrCode=0 THEN 
    				charr[20].Value:=mod3.inp4;
    			ELSE
    				charr[20].Value:=0;
    			END_IF
    			
    			IF charr[21].ErrCode=0 THEN 
    				charr[21].Value:=mod3.inp5;
    			ELSE
    				charr[21].Value:=0;
    			END_IF
    			
    			IF charr[22].ErrCode=0 THEN 
    				charr[22].Value:=mod3.inp6;
    			ELSE
    				charr[22].Value:=0;
    			END_IF
    			
    			IF charr[23].ErrCode=0 THEN 
    				charr[23].Value:=mod3.inp7;
    			ELSE
    				charr[23].Value:=0;
    			END_IF
    			
    			IF charr[24].ErrCode=0 THEN 
    				charr[24].Value:=mod3.inp8;
    			ELSE
    				charr[24].Value:=0;
    			END_IF
    
    			CNT:=0;
    		ELSE
    			CNT:=CNT+1;
    		END_IF	
    	4: 
    		//Опрашиваем модуль МУ8Р по адресу 3 - управление дискретными выходами
    		
    		IF Mod4_Enabl=FALSE THEN
    			Mod4_Enabl:=TRUE;	
    		END_IF
    		mod4(Enabl:=Mod4_Enabl, out1:=ChArrBit[1], out2:=ChArrBit[2], out3:=ChArrBit[3], out4:=ChArrBit[4], 
    								out5:=ChArrBit[5], out6:=ChArrBit[6], out7:=ChArrBit[7], out8:=ChArrBit[8]);		
    		IF mod4.done  THEN			
    			Mod4_Enabl:=FALSE;
    			mod4(Enabl:=Mod4_Enabl);
    			CurrentModule:=CurrentModule+1;
    			CNT:=0;
    		ELSE
    			CNT:=CNT+1;
    		END_IF			
    	5:
    		//Опрашиваем модуль МУ8Р по адресу 5 - управление дискретными выходами
    		
    		IF Mod5_Enabl=FALSE THEN
    			Mod5_Enabl:=TRUE;	
    		END_IF
    		mod5(Enabl:=Mod5_Enabl, out1:=ChArrBit[9], out2:=ChArrBit[10], out3:=ChArrBit[11], out4:=ChArrBit[12], 
    								out5:=ChArrBit[13], out6:=ChArrBit[14], out7:=ChArrBit[15], out8:=ChArrBit[16]);		
    		IF mod5.done  THEN			
    			Mod5_Enabl:=FALSE;
    			mod5(Enabl:=Mod5_Enabl);
    			CurrentModule:=CurrentModule+1;
    			CNT:=0;
    		ELSE
    			CNT:=CNT+1;
    		END_IF		
    	6: 
    		//Опрашиваем модуль МУ8Д4Р по адресу 6 - управление 4 дискретными выходами 
    		
    		IF Mod6_Enabl=FALSE THEN
    			Mod6_Enabl:=TRUE;	
    		END_IF
    		mod6(Enabl:=Mod6_Enabl, out1:=ChArrBit[17], out2:=ChArrBit[18], out3:=ChArrBit[19], out4:=ChArrBit[20]);		
    		IF mod6.done  THEN			
    			Mod6_Enabl:=FALSE;
    			mod6(Enabl:=Mod6_Enabl);
    			CurrentModule:=CurrentModule+1;
    		END_IF	
    	7: 
    		//Опрашиваем модуль МУ8Д4Р по адресу 6 - 8 дискретных входов 
    		
    		IF Mod7_Enabl=FALSE THEN
    			Mod7_Enabl:=TRUE;	
    		END_IF
    		mod7(Enabl:=Mod7_Enabl);		
    		IF mod7.done  THEN			
    			Mod7_Enabl:=FALSE;
    			mod7(Enabl:=Mod7_Enabl);				
    			CurrentModule:=CurrentModule+1;
    
    			ChArrDI[1].Value:=mod7.inp1;
    			ChArrDI[2].Value:=mod7.inp2;
    			ChArrDI[3].Value:=mod7.inp3;
    			ChArrDI[4].Value:=mod7.inp4;
    			ChArrDI[5].Value:=mod7.inp5;
    			ChArrDI[6].Value:=mod7.inp6;
    			ChArrDI[7].Value:=mod7.inp7;
    			ChArrDI[8].Value:=mod7.inp8;
    			CNT:=0;
    		ELSE
    			CNT:=CNT+1;
    		END_IF	
    	
    ELSE
    	CurrentModule:=1; 
    END_CASE
    
    IF CNT>100 THEN
    	CNT:=0;
    	CurrentModule:=CurrentModule+1;
    END_IF

    Девайсы добавлять конечно просто и удобно, но я сам не понял, что за ограничение на 10 опрашиваемых параметров в одном модбас-девайсе? Получается можно опросить 8 аналоговых входов и допустим еще считать всего 2 состояния канала, а как состояния остальных 6 каналов ? При этом еще один девайс с тем-же адресом добавить не получится (чтобы доопросить нехватающие параметры).... не айс.
    А программно - как хочу так и ворочу, ограничений меньше.
    Последний раз редактировалось ValeriyVK; 26.08.2013 в 09:50.

Похожие темы

  1. СПК1хх - Линейка панельных контроллеров для локальных систем.
    от Александр Приходько в разделе СПК1xx (архив)
    Ответов: 333
    Последнее сообщение: 30.03.2015, 08:42
  2. СПК1ХХ вебинар download
    от Евгений_Томск в разделе СПК1xx (архив)
    Ответов: 2
    Последнее сообщение: 04.05.2013, 18:16
  3. модбас мастер
    от rovki в разделе Трёп (Курилка)
    Ответов: 46
    Последнее сообщение: 21.04.2013, 15:15
  4. Работа с модбас
    от alek4322 в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 26.03.2012, 08:06

Ваши права

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