Сообщение от
Dmitro
Помогите пжл,
Мне надо взять Float он же real, со слейв модуля с адресом 20, по смещению 4 (МВА8, температура в канале 1)
и записать ее:
- в панель по адресу 256.
- в другой слейв (плк150) по адресу 60.
Верен ли нижеследующий макрос?
WORD ArrValue[2];
READ(PLC, 20, MODBUS_RTU_REG_4X, 4, 0, TYPE_DWORD, &ArrValue);
*(float*)(PSW+256)=ArrValue;
WRITE(PLC, 1, MODBUS_RTU_REG_4X, 60, 0, TYPE_DWORD, ArrValue);
И почему в "директоре" нет никакой проверки синтаксиса?
А почему сразу не написать так
Код:
float fValue;
Read(PLC, 20, MODBUS_RTU_REG_4X, 4, 0, TYPE_DWORD, &fValue);
*(float*)(PSW+256)=fValue;
Write(PLC, 1, MODBUS_RTU_REG_4X, 60, 0, TYPE_DWORD, fValue);
ЗЫ.
Как оказалось у функции Write()
BOOL Write (PortName, SlaveID, DeviceTypeReg, Adr, 0, DataType, Var);
тип данных для переменной Var определен как DWORD
по этому если записать так
Код:
Write(PLC, 1, MODBUS_RTU_REG_4X, 60, 0, TYPE_DWORD, fValue);
то для fValue будет выполнено неявное преобразование типа float --> DWORD и в результате, если fValue=123.456 в ПЛК отправится 123
Правильно будет так
Код:
Write(PLC, 1, MODBUS_RTU_REG_4X, 60, 0, TYPE_DWORD, *(float*)&fValue);
или так, если использовать макрос Float_2_DWord
Код:
float fValue;
Read(PLC, 20, MODBUS_RTU_REG_4X, 4, 0, TYPE_DWORD, &fValue);
*(float*)(PSW+256)=fValue;
Write(PLC, 1, MODBUS_RTU_REG_4X, 60, 0, TYPE_DWORD, Float_2_DWord(fValue));