Страница 2 из 13 ПерваяПервая 123412 ... ПоследняяПоследняя
Показано с 11 по 20 из 128

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

  1. #11
    Пользователь
    Регистрация
    10.04.2010
    Адрес
    Алтайский край,г.Рубцовск
    Сообщений
    955

    По умолчанию

    Версию прошивки теперь только на следующей недели, а порт через ваши библиотеки он же работал, и опрашивал модули, да и переключал я оба порта В RS-485.

  2. #12

    По умолчанию

    Лучше делать программный опрос через библиотеки 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 в 10:50.

  3. #13

    По умолчанию

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

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

    При работе с CDS3.5 надо немного по другому смотреть на вещи.
    Да, есть ограничение на число каналов.
    НО!!!!
    Все привыкли делать опрос по одному решистру. Но зачем? Не проще ли и не быстрее ли использовать групповой опрос?

    Пример с МВ110-8A.

    У вас 8 каналов (8 аналоговых входов). Каждый канал использует по 6 регистров

    0-Положение десятичной точки в целом значении
    1-Целое значение измерение со смещением точки
    2-Статус измерения - код исключительной ситуации
    3-Циклическое время измерения
    4,5-Измерение в представлении с плавающей точкой

    Вы создаете каналы длиной по 6 регистров:
    Chanel_MV110_8A.png
    Далее эти каналы привязываете к переменным и обрабатываете в программе.

    В моем примере с 8А опрашиваются абсолютно все регистры. Для большинства достаточно опрашивать по 3 регистра (ошибку + Float).
    И поверьте, так опрос будет работать намного быстрее, чем каждый регистр опрашивать отдельно.

    CODESYS 3.5 - это в первую очередь групповые запросы!

    На днях выложу полноценную инструкцию по настройке Modbus в CDS3.5!
    Последний раз редактировалось Александр Приходько; 27.08.2013 в 00:35.

  4. #14

    По умолчанию

    Спасибо, интересный подход )

  5. #15
    Пользователь Аватар для Lam-Ka
    Регистрация
    12.08.2013
    Адрес
    Красноярский край
    Сообщений
    201

    По умолчанию

    А в CdS 2.4 подобное можно организовать?
    Что нельзя запрограммировать- приходиться паять.

  6. #16
    Пользователь
    Регистрация
    10.04.2010
    Адрес
    Алтайский край,г.Рубцовск
    Сообщений
    955

    По умолчанию

    Добрался наконец до контроллера версия OWEN-20130612-3180

  7. #17

    По умолчанию

    Цитата Сообщение от Lam-Ka Посмотреть сообщение
    А в CdS 2.4 подобное можно организовать?
    Есть CDS2.3. Если вы делаете обмен через конфигурацию, то нельзя. К сожалению.
    Но если вы делаете обмен посредством библиотеки Modbus? то она работает по подобному принципу.

    Цитата Сообщение от жекон Посмотреть сообщение
    Добрался наконец до контроллера версия OWEN-20130612-3180
    Прошивка у Вас актуальная. Давайте поступим так.
    Опишите,что вы пытаетесь делать и выложите архив вашего проекта.

    Для того чтобы сделать архив проекта, необходимо открыть ваш проект. И в самом CODESYS сделать: Файл -> Архив проекта -> Сохранить отправить.
    Галочки оставляете, только те, что стоят по умолчанию. После этого вы получите файл с расширением ProjectArchive. Его и выкладывайте.

  8. #18
    Пользователь Аватар для Lam-Ka
    Регистрация
    12.08.2013
    Адрес
    Красноярский край
    Сообщений
    201

    По умолчанию

    Цитата Сообщение от Александр Приходько Посмотреть сообщение
    Есть CDS2.3. Если вы делаете обмен через конфигурацию, то нельзя. К сожалению.
    Но если вы делаете обмен посредством библиотеки Modbus? то она работает по подобному принципу.
    Вы правы, я опечатался. То есть средствами библиотеки я могу организовать некий массив регистров и прочитать его одной командой?
    Что нельзя запрограммировать- приходиться паять.

  9. #19

    По умолчанию

    Цитата Сообщение от Lam-Ka Посмотреть сообщение
    Вы правы, я опечатался. То есть средствами библиотеки я могу организовать некий массив регистров и прочитать его одной командой?
    Абсолютно верно.

  10. #20
    Пользователь Аватар для Lam-Ka
    Регистрация
    12.08.2013
    Адрес
    Красноярский край
    Сообщений
    201

    По умолчанию

    Цитата Сообщение от Александр Приходько Посмотреть сообщение
    Абсолютно верно.
    А можно пример попросить?
    Что нельзя запрограммировать- приходиться паять.

Страница 2 из 13 ПерваяПервая 123412 ... ПоследняяПоследняя

Похожие темы

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

Ваши права

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