Real не проходит по modbus, надо делать структуру или как там:
DataR: real;
DataM: array (0.. 1) of word; поищите на форуме, есть ссылка на документ по работе с вордами в modbus
Modbus это 1 или 2 word. Так как вы сделали, не делается.
Real не проходит по modbus, надо делать структуру или как там:
DataR: real;
DataM: array (0.. 1) of word; поищите на форуме, есть ссылка на документ по работе с вордами в modbus
Modbus это 1 или 2 word. Так как вы сделали, не делается.
Конечно, не делается. Это можно оставить, оно сейчас никакой рояли не играет, даже если я сделаю как вы предлагаете разбиванием при помощи ARRAY на 2 WORD - будет так же песня.
Вопрос мой так и не получил ответа: как мне в программе сделать симуляцию REAL значения, что бы я на панельке увидел её. Я использую глобальные переменные вот их и хочу туда/сюда пересылать.
Расскажу как делал я.
Имеется контроллер, сенсорная панель с modbus tcp master, кнопочная панель с modbus rtu master.
Составил таблицу регистров в экселе, и определил их количество. Для реалов соответственно зарезервировал 2 регистра. В контроллере сделал массив на данное количество регистров и соотнес каждый элемент массива своему регистру. А реал выжимал структурой, или как там она называется, нет под рукой кодекса, только телефон.
Ну и ещё галочку в кодесисе поставил, чтение и запись!
TYPE DUT_MODBUS_Real_Word:
UNION
U_RealInModbus: ARRAY [0..1] OF WORD;
U_RealInProgramm: REAL;
END_UNION
END_TYPE
Использовать объединение.
В программе задаете реал, а ворды соотносите с регистрами. Панель сама поймёт где что, если правильно настроить.
Вот примерно этим же и занимаюсь.
Только хочу понять с какого регистра ползти, как биты и регистры проименовать, а для этого делаю эдакий полевой стенд, что бы понять чего куда крутить. Но раньше работало, а сейчас почему-то отказалось. Причём даже сегодня с 1 регистром удалось побаловаться, с другими уже нет, а потом и 1 отвалился.
https://owen.ru/product/codesys_v3/documentation
Там есть документ, называется протокол модбас.
Изучайте. А то вы другой контроллер программируете и пытаетесь получить ответы, которые тут уже описаны.
Последний раз редактировалось МихаилГл; 06.11.2023 в 21:01.
И ещё, соотносить можно что-то одно, либо целиком регистры, либо их биты по отдельности. Вместе и то и то нельзя, выдаст такую же ошибку.
Я не делал как вы, а просто соотносил регистры, типа reg[1] и т.д. что бы в программе использовать циклы.
Иначе вам каждый этот бит регистра в программе присваивать какой-то переменной, если у вас 40 механизмов и на каждый 50 аварий и состояний, то вам описывать 2000 строк, вы на этом неделю потеряете и запутаетесь в коде.
Ексель сам пишет по скрипту эти строки, я только их заполняю. В этом вся соль. Поэтому ошибки быть не может.
У меня имеется контроллер на борту которого MODBUS TCP/IP, в котором уже есть входы и выходы, которые автоматические создаются производителем в своём ПО. Я эти входы присваиваю к глобальным переменным, что бы их же и отсылать в HMI. А для этого я создаю ещё устройство HMI делаю его мастером и ему пытаюсь всё это конвертировать. Ну и конечно же добавлять свои переменные, как вы уже и упомянули аварии, состояния и т.д. В ручке делать это всё = безумие, поэтому и пытаюсь этот процесс автоматизировать, что бы уйти от ошибок.
Вот, достал старую версию программы от 1.11.23 и там как видно на скринах привязанное значение A:=real; успешно прицепилось к адресу регистра RW10 со сдвигом 10 009 в CDS без всяких ошибок.
Но уже B:=REAL во второй канал с адресом RW4 и сдвигом 10 003 выползает в ошибку. Где-то есть перехлёст по адресам. Конечно счас полетят помиодры мол там нет плавающей запятой и это верно, мне главное узнать именно адреса глобальных переменных регистров и их даже привязывать не нужно будет, я просто напишу глобальная переменная a AT %QW 8 и т.д. По факту (в полях на оборудовании) у меня эти значения передавались с плавающей запятой. На скринах уже есть эмулятор панельки справа.