Modicon M340 Modbus "No Processor System Resource"

Прочие PLC и HMI на русском
Post Reply
DjonnyD
Posts: 6
Joined: Wed Aug 21, 2013 7:30 pm

Modicon M340 Modbus "No Processor System Resource"

Post by DjonnyD » Mon Jan 13, 2014 2:43 pm

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

Столкнулся с проблемой при опросе 25 устройств по Modbus: есть необходимость постоянного опроса каждого устройства, по 2 байта, при этом в параметрах GEST в поле Communication State - 0B: No system resource.

При опросе 20 устройств - все хорошо.

Есть ли какие-либо общие ограничения? В документации к Unity Pro не смог найти информацию на этот счет.

pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев
Contact:

Re: Modicon M340 Modbus "No Processor System Resource"

Post by pupena_san » Mon Jan 13, 2014 3:11 pm

Подобного не втсречал. Тем не менее следующие вопросы:
1) Используте Modbus или Modbus/TCP?
2) Какими функциями пользуетесь?
3) Как устроен опрос, сколько одновременно вызывается комм. функций?

DjonnyD
Posts: 6
Joined: Wed Aug 21, 2013 7:30 pm

Re: Modicon M340 Modbus "No Processor System Resource"

Post by DjonnyD » Mon Jan 13, 2014 3:20 pm

1. Modbus
2. READ_VAR
3. Количество функций = количеству устройств. Задача, в которой находятся секции с опросами - циклическая, поэтому наверное постоянный опрос, если есть такая необходимость,может быть оправдан?

Если что, извиняюсь за глупость- нигде ни слова не нашел про ограничения.

pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев
Contact:

Re: Modicon M340 Modbus "No Processor System Resource"

Post by pupena_san » Mon Jan 13, 2014 3:31 pm

Получается, что у Вас в один цикл может быть вызвано несколько функций одновременно? Если так, то нужно организовывать "карусель" опроса.
В хелпе по функции READ_VAR есть пункт Description ->
Help Unity Pro wrote:The following table gives the capacities of each communication channel to simultaneously process transactions according to various configurations on Modicon M340 PLCs.
Modbus master serial port - 8/ 16/ 16/ 16
Думаю что Вы как раз на это наткнулись.

DjonnyD
Posts: 6
Joined: Wed Aug 21, 2013 7:30 pm

Re: Modicon M340 Modbus "No Processor System Resource"

Post by DjonnyD » Mon Jan 13, 2014 4:00 pm

Да, видимо это ограничение на 16 каналов как раз относится к моему случаю,
только я ума не приложу, как можно разбить выполнение секций с коммуникационными функциями по циклам выполнения задачи, можете, пожалуйста, дать наводку?

pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев
Contact:

Re: Modicon M340 Modbus "No Processor System Resource"

Post by pupena_san » Mon Jan 13, 2014 4:46 pm

Можно устроить так званную "карусель" на базе автоматного подхода. Определяете n+1 шагов, где n - количество запросов. 0-й шаг - шаг инициализации, где можно сделать скидывание всех запросов. Определяется переменная шага.
Когда шаг равен 0, после инициализации идет переход на 1-й шаг.
Когда шаг равен 1 делается 1-й запрос. Ожидается окончание обработки функции (скидывается 0-й бит в 0-м слове параметров таблицы управления обменом), после чего идет переход на 2-й шаг.
Когда шаг равен 2 делается 2-й запрос....
Когда шаг равен n делается n-й запрос. ... после чего идет переход на 1-й шаг.
Можно использовать одну и ту же функцию, подставляя другие параметры (компактный код). Можно воспользоваться SELECT CASE (более читабельно, но код побольше), можно и другими способами. Кому как больше нравится. Вобщем дальше - техника программирования. Только помните, что запрос нужно делать только после обработки предыдущего.

DjonnyD
Posts: 6
Joined: Wed Aug 21, 2013 7:30 pm

Re: Modicon M340 Modbus "No Processor System Resource"

Post by DjonnyD » Fri Jan 24, 2014 1:18 pm

Спасибо!

Все работает, единственное, что для проверки нулевого бита нулевого слова из таблицы управления обменом я нашел функции IntToWord и WordToBit.
Для проверки работы Read_Var функции IntToWord и WordToBit работают хорошо!

А вот для Write_Var нужно убедиться что бит, который мы хотели записать, извиняюсь, записался, поэтому следом за ней считываем необходимы регистр с помощьюRead_Var, таким образом перед очередным устройством в нашей "карусели опроса" сначала убеждаемся что функции отработали, далее записываем данные, перед чтением регистра для проверки снова вызываем функции IntToWord и WordToBit - и вот тут проблема - второй раз эти две функции для проверки бита уже на работают. Пока пришлось оставить без проверки:запись и чтение идут вподряд, причем после чтения данных IntToWord и WordToBit работают уже нормально, то есть можно убедиться, что функция Read_Var отработала и можно переходить к следующему устройству.


Вот пример (кусок из Case) как работает:
Show

Code: Select all

	7: if out7=1 then

(* 7 *)
	WORD_TO_BIT (IN := INT_TO_WORD (IN := param52[0]) ,
            BIT0 => bitW7);
	
         (*   WORD_TO_BIT (IN := INT_TO_WORD (IN := param26[0]) ,
            BIT0 => bitR7);  эта функция для проверки окончания чтения  не работает,
          поэтому вместо       if bitW7=0 and if bitR7=0 then  пришлось отсавить только:*)


	if bitW7=0 then   


	WRITE_VAR (ADR := ADDM (IN := '0.0.0.72'),
           OBJ := '%MW',
           NUM := 6,
           NB := 1,
           EMIS := Coil7,
           GEST := Param52);

	end_if;

(*	WORD_TO_BIT (IN := INT_TO_WORD (IN := param52[0]) ,
            BIT0 => bitW7);           Здесь эта фунция уже не работает, поэтому приходится сразу  переходить к Read_Var: *)

	if bitW7=0 then
		

	READ_VAR (ADR := ADDM (IN := '0.0.0.72'),
            OBJ := '%MW',
            NUM := 6, 
            NB := 1,
            GEST := param26,
            RECP => Result7);

	end_if;

	WORD_TO_BIT (IN := INT_TO_WORD (IN := param26[0]) ,
            BIT0 => bitR7);


	if bitR7=0 then    


		if result7[0]=coil7[0] then
			out7:=0;
			Inc:=Inc+1;
		end_if;
	
	
	end_if;

	else Inc:=Inc+1;

	end_if;

pupena_san
Posts: 392
Joined: Fri Dec 18, 2009 3:02 pm
Location: Киев
Contact:

Re: Modicon M340 Modbus "No Processor System Resource"

Post by pupena_san » Fri Jan 24, 2014 2:57 pm

DjonnyD wrote:Спасибо!

Code: Select all

	7: if out7=1 then
(* 7 *)
	WORD_TO_BIT (IN := INT_TO_WORD (IN := param52[0]) ,
            BIT0 => bitW7);
	
         (*   WORD_TO_BIT (IN := INT_TO_WORD (IN := param26[0]) ,
            BIT0 => bitR7);  эта функция для проверки окончания чтения  не работает,
          поэтому вместо       if bitW7=0 and if bitR7=0 then  пришлось отсавить только:*)
Слишком сложно. Обращаться к 0-му биту можно так:

Code: Select all

bitR7:=param52[0].0;

Post Reply