Поначалу это может звучать странно, и я понимаю, почему. Моя проблема немного сложна для объяснения, но, надеюсь, я могу объяснить ее хорошо.
РЕДАКТИРОВАТЬ: заполнение может быть уже выполнено в ЦП, но это заполнение теряется при сохранении в регистрах локальной памяти HMI, поэтому выравнивание выключен, и HMI не отображает данные правильно.
У меня есть HMI, который я программирую. Программное обеспечение для создания страниц в HMI в основном перетаскивается. Это важно отметить, поскольку пользователь не может получить доступ к переменным в макросах, только после сохранения данных в локальной памяти они могут вводить данные в эти объекты перетаскивания.
У меня есть датчик, который подключен к HMI, и у датчика есть «блоки» памяти, доступ к которым возможен только при многоканальном считывании. Это означает, что мне нужен макрос, чтобы прочитать эти данные и временно сохранить их в HMI, чтобы вы могли отредактировать их перед отправкой обратно после нажатия кнопки «отправить»
Элементы перетаскивания могут получить доступ только к 16- битовые регистры. Входящие данные имеют отдельные байты, которые выбрасываются в середине.
Я создал структуру, получил данные в структуре и записал их в регистры HMI. Вот код в C:
struct configStruct { // 72 Bytes or 36 words/registers long
char description[32]; // char string
float c1CE_A; // coefficient 1_A
float c1CE_B; // coefficient 1_B
float c1CE_C; // coefficient 1_C
char c1useLogFit; // Single byte that is 1 if "Log Fit" is enabled, and 0 if disabled.
float c2CE_A;
float c2CE_B;
float c2CE_C;
char c2useLogFit;
float c3CE_A;
float c3CE_B;
float c3CE_C;
char c3useLogFit;
char dummyByte;
};
int MacroEntry()
{
struct configStruct *dataPtr, data1;
ReadData(ProductConfig_PLC,1,2305,36,(void*)&data1); // read data from sensor and save in struct
// Something needs to happen here that converts the bytes into words so the data lines up with the 16-bit registers in the HMI
WriteData(ProductConfig_HMI,0,2305,36,(void*)&data1); // write temporary data to HMI from struct
return 0;
}
(ProductConfig_PLC / HMI определены на вкладке в программном обеспечении. У него есть опции для адреса чтения / записи и еще много чего)
Функция ReadData
работает нормально, как и WriteData
. Проблема в том, что когда макрос сохраняет структурные данные в 16-битные регистры HMI, байты сбрасывают выравнивание. В итоге мои поплавки разделены между регистрами. Я знаю, что это так, потому что первые три поплавка отображаются нормально. Другие плавающие после одного байта не делаются.
(Кроме того, я исправил это, используя массивы и сдвигая байты, но это чрезвычайно утомительно, и у меня есть еще много дел)
Есть ли способ взять однобайтовые переменные и преобразовать их в слова, чтобы при их записи в HMI выравнивание было правильным? Я не могу получить доступ к байтам, если в этих же регистрах есть другие данные.
Я также знаю, что мог бы просто создать другую структуру с переменными правильного размера и скопировать все заново. Однако это становится проблемой, потому что некоторые «блоки» в датчике содержат сотни переменных, и делать это вручную для отправки и получения было бы утомительно, и просто онемел.
* Вот определение данных:
The Product Code Calibration Database starts at modbus address 0x900
repeats for each Product Code (currently 0 – 49). Each product code
calibration table is 72 bytes/36 words long. To calculate the start address for each
product code: address = 0x900 + (36 * Product Code number)
Data Definition:
Product Code Description – character string (32 bytes)
Constituent 1 Coefficient A – IEEE float (4 bytes)
Constituent 1 Coefficient B – IEEE float (4 bytes)
Constituent 1 Coefficient C – IEEE float (4 bytes)
Constituent 1 Use Log Fit - 8 bit integer (1 byte) 1= use log fit
Constituent 2 Coefficient A – IEEE float (4 bytes)
Constituent 2 Coefficient B – IEEE float (4 bytes)
Constituent 2 Coefficient C – IEEE float (4 bytes)
Constituent 2 Use Log Fit - 8 bit integer (1 byte) 1= use log fit
Constituent 3 Coefficient A – IEEE float (4 bytes)
Constituent 3 Coefficient B – IEEE float (4 bytes)
Constituent 3 Coefficient C – IEEE float (4 bytes)
Constituent 3 Use Log Fit - 8 bit integer (1 byte) 1= use log fit
Ссылка на таблицу HMI здесь
Спасибо за помощь.