Тема / Topic: Создание шаблона программы с перепривязкой аргументов
Сергей Кравчук
Forum Member / Участник форума
Участник № / Member № 5384
отправлено / posted
День добрый! Прошу помощи в создании шаблона программы для вычисления серийных номеров датчиков.
Чтение данных с контроллера осуществляется с помощью групповых запросов по modbus. Интересующие нас данные передаются в переменную класса CALL (тип вызова ChGroupReq). Адресное пространство: 30001-30008 – значения каналов, 30014-30029 – адреса интересующих нас переменных для вычисления серийного номера и типа датчика. Т.е. Для канала 1 30014 – младшая часть заводского номера, (беззнаковое 16 разрядное значение), K001_1_L; 30015 – старшая часть заводского номера и тип датчика, (беззнаковое 16 разрядное значение) , K001_1_H ; …. Для канала 8 30028 – младшая часть заводского номера, (беззнаковое 16 разрядное значение), K001_8_L; 30029 – старшая часть заводского номера и тип датчика, (беззнаковое 16 разрядное значение), K001_8_H; В аргументах канала класса CALL передаем значения в переменные, которые потом обрабатываем в программе. Выражение вычисления серийного номера на процедурном языке Techno ST имеет следующий вид для канала № 1: K001_1_SER_N_In = ((K001_1_H_R shl 16))|K001_1_L_R; K001_1_SER_N_In = K001_1_SER_N_In & 0x1FFFFF . Выражение вычисления типа датчика на процедурном языке Techno ST имеет следующий вид для канала № 1: K001_1_TYP_S_In = (K001_1_H_R shr 5); K001_1_TYP_S_In = K001_1_TYP_S_In & 0x001F. В настоящий момент создана программа для 1 контроллера. Она работает отлично. Но! Необходимо создать программу, чтобы при ее вызове указывать № контроллера и в программе происходила перепривязка аргументов для этого контроллера. Подобные программы мы писали, но в них можно использовать 1 канал. Возможно ли сделать такую программу, в которой будет происходить перепривязка по 4 каналам. Т.к. для вычисления серийника и типа датчика, задействованы 4 канала класса Float (2 для вычислений и 2 в которых хранятся данные) ???
Сообщения / Posts 39 | Из / From: Украина
| IP / IP: IP адрес / IP address |
отправлено / posted
См."Атрибуты каналов, отображаемые профайлером/ArgSize" и функции getAttributeI(UDINT ch_id, UINT attr_id) языка ST. Вы можете из ST-программы обращаться к любым аргументам каналов через атрибуты, нумерация которых начинается с 1000.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Сергей Кравчук
Forum Member / Участник форума
Участник № / Member № 5384
отправлено / posted
У нас в одном канале класса CALL сидят аргументы К001_1_L,K001_1_H ... К001_8_L,K001_8_H необходимые для обработки. Т.е. мне надо еще в этот канал завести аргументы K001_1_SER, K001_1_TYP ... K001_8_SER, K001_8_TYP и можно написать программу с виртуальной привязкой к аргументам канала класса CALL (атрибуты 140-203). А потом привязать эту программу уже к каждому интересующему меня каналу класса CALL. И тогда в принципе функция getAttributeI(UDINT ch_id, UINT attr_id) не нужна, т.к. можно напрямую обращаться к аргументу программы. Правильно ли я Вас понял?
Сообщения / Posts 39 | Из / From: Украина
| IP / IP: IP адрес / IP address |
отправлено / posted
При групповом запросе по Modbus количество запрашиваемых аргументов запрашивающего канала ChGroupReq будет определять количество запрашиваемых переменных. Поэтому нельзя "еще в этот канал завести аргументы K001_1_SER, K001_1_TYP ... K001_8_SER, K001_8_TYP".
Пришлите, пожалуйста, нам Ваш проект и структуру предполагаемой системы - количество контроллеров с 8 датчиками каждый, - где и как Вы хотите хранить и как использовать серийные номера и типы датчиков, - как это согласуется с "для вычисления серийника и типа датчика, задействованы 4 канала класса Float (2 для вычислений и 2 в которых хранятся данные)"?
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |