Цитата Сообщение от capzap Посмотреть сообщение
а как же примеры из оскат, создается структура, создается VAR_GLOBAL CONSTANT и в нем объявляется такой пользовательский тип данных или вопрос не в этом
Да вся соль как раз в том, что у меня не все элементы структуры являются константами. Мне от изменений нужно защитить только некоторые (содержащие номера регистров сервопривода).

Codesys не дает целостного механизма работы по Modbus если нужно обмениваться достаточно большим количеством переменных. Если использовать таблицу каналов, каждый канал имеет свой индекс, к нему привязана переменная. Если обмен по флагу - нужны задержки и я ХЗ как нормально проверить что все данные записаны (пробовал вешать на циклическую задачу с малым временем вызова - все-равно бывают факты пропуска).
Если использовать "приложение" ModbusChannel вроде все хорошо, НО (огромное такое) в качестве аргумента ModbusChannel принимает iChannelIndex и нужно придумать связку Переменная -> К***** а ее нет. В переменную данные записал но хрен-то я знаю номер канала к которой привязана переменная.
БОлее-менее OwenCommunication, там нет каналов - чисто регистры устройства. Но к переменным нужно привязать адреса регистров, чтоб можно было в цикле отправлять данные и не париться, что я собственно и сделал. Такая вот структура (примерно, прошу не пинать)
Код:
TYPE MB_DWORD :
STRUCT
	iChannelIndex	: INT;
	uiDataAddr		: UINT;
	uiDataCount		: UINT := 2;
	unData			: U_DW2W;
END_STRUCT
END_TYPE
И потом собираю все регистры в Массив устройства (тут уже я подумываю о FB с закрытыми свойствами, но это тож не сильно поможет). И полю uiDataAddr определяю регистр памяти устройства. Но если, случайно, эти значения изменятся.... все сломается...
Код:
TYPE ST_SERVO_RW :
STRUCT
	wInputSignal: ARRAY[0..7] OF MB_SWORD :=
		[
			(uiDataAddr := 500),
			(uiDataAddr := 501),
			(uiDataAddr := 502),
			(uiDataAddr := 503),
			(uiDataAddr := 504),
			(uiDataAddr := 505),
			(uiDataAddr := 506),
			(uiDataAddr := 507)
		];
	wdwLevInSignal: MB_DWORD 	:= (uiDataAddr := 508);
	wdwOutSignal: MB_DWORD 	:= (uiDataAddr := 510);
	wP0_ConMode: MB_SWORD 	:= (uiDataAddr := 0);
	wP2_EncTypeRes: MB_SWORD	:= (uiDataAddr := 2);
	wP205_Gear: MB_SWORD 		:= (uiDataAddr := 205);
	wP206_Gear: MB_SWORD 		:= (uiDataAddr := 206);
	wP225_Gear: MB_SWORD 		:= (uiDataAddr := 225);
	wP226_Gear: MB_SWORD 		:= (uiDataAddr := 226);
	wP525_Coin: MB_SWORD 		:= (uiDataAddr := 525);
	wP700_IntPosP: MB_SWORD 	:= (uiDataAddr := 700);
	wP765_IntPosDZT: MB_SWORD	:= (uiDataAddr := 765);
	wP770_IntPosSw: MB_SWORD 	:= (uiDataAddr := 770);
	stHoming: HOME_POS_REGS;
	stIntPos: ARRAY[0..15] OF INT_POS_REGS := 
		[
			(unIntPos := (uiDataAddr := 701),	wIntPosACDC := (uiDataAddr := 749), wIntPosSPD := (uiDataAddr := 733)),
			(unIntPos := (uiDataAddr := 703), 	wIntPosACDC := (uiDataAddr := 750), wIntPosSPD := (uiDataAddr := 734)),
			(unIntPos := (uiDataAddr := 705), 	wIntPosACDC := (uiDataAddr := 751), wIntPosSPD := (uiDataAddr := 735)),
			(unIntPos := (uiDataAddr := 707), 	wIntPosACDC := (uiDataAddr := 752), wIntPosSPD := (uiDataAddr := 736)),
			(unIntPos := (uiDataAddr := 709), 	wIntPosACDC := (uiDataAddr := 753), wIntPosSPD := (uiDataAddr := 737)),
			(unIntPos := (uiDataAddr := 711), 	wIntPosACDC := (uiDataAddr := 754), wIntPosSPD := (uiDataAddr := 738)),
			(unIntPos := (uiDataAddr := 713), 	wIntPosACDC := (uiDataAddr := 755), wIntPosSPD := (uiDataAddr := 739)),
			(unIntPos := (uiDataAddr := 715), 	wIntPosACDC := (uiDataAddr := 756), wIntPosSPD := (uiDataAddr := 740)),
			(unIntPos := (uiDataAddr := 717), 	wIntPosACDC := (uiDataAddr := 757), wIntPosSPD := (uiDataAddr := 741)),
			(unIntPos := (uiDataAddr := 719), 	wIntPosACDC := (uiDataAddr := 758), wIntPosSPD := (uiDataAddr := 742)),
			(unIntPos := (uiDataAddr := 721), 	wIntPosACDC := (uiDataAddr := 759), wIntPosSPD := (uiDataAddr := 743)),
			(unIntPos := (uiDataAddr := 723), 	wIntPosACDC := (uiDataAddr := 760), wIntPosSPD := (uiDataAddr := 744)),
			(unIntPos := (uiDataAddr := 725), 	wIntPosACDC := (uiDataAddr := 761), wIntPosSPD := (uiDataAddr := 745)),
			(unIntPos := (uiDataAddr := 727), 	wIntPosACDC := (uiDataAddr := 762), wIntPosSPD := (uiDataAddr := 746)),
			(unIntPos := (uiDataAddr := 729), 	wIntPosACDC := (uiDataAddr := 763), wIntPosSPD := (uiDataAddr := 747)),
			(unIntPos := (uiDataAddr := 731), 	wIntPosACDC := (uiDataAddr := 764), wIntPosSPD := (uiDataAddr := 748))
			
		];
END_STRUCT
END_TYPE