PDA

Просмотр полной версии : Панель СП310Р. Переменная Float, сравнение



bonzay74
04.06.2019, 19:05
Имеется данная панель, с контроллера получаю данные в формате float через макрос и пишу во внутреннюю переменную.
WORD ArrValue[2];
DWORD dwVar=0;
BYTE byVar1=0;
BYTE byVar2=0;
BYTE byVar3=0;
BYTE byVar4=0;
float fValue;
Reads(DOWNLOAD, 205, MODBUS_RTU_REG_4X, 20, 2, &ArrValue);
fValue = *(float*)(ArrValue);
*(float*)(PSW+300) = fValue;
byVar1 = LOBYTE(PSW[300]);
byVar2 = HIBYTE(PSW[300]);
byVar3 = LOBYTE(PSW[301]);
byVar4 = HIBYTE(PSW[301]);
PSW[500] = MAKEWORD(byVar2,byVar1);
PSW[600] = MAKEWORD(byVar4,byVar3);
dwVar=MAKEDWORD(PSW[500],PSW[600]);
*(DWORD*)(PSW+350)= dwVar;

Вопрос вот в чем, мне надо сравнить полученное значение ( с больше 0, меньше 0 и равно 0) и соответственно к примеру зажигать один из трех соответствующих внутренних битов . Но у меня никак не получается получить отрицательное значение, кто сможет подсказать , в чем моя проблема (Пробовал уже и местами менять, и то и се) ?
P.S. прошу сильно не ругаться, первый раз работаю с овеном и этой панелью.

krollcbas
04.06.2019, 19:37
А если предположить, что сравнить можно не в панели, а в контроллере. Завести еще одно статусное слово в формате WORD и отправлять в панель.
Там используя эти три бита уже показывать эти "лампочки"

Пример:
Float_sts:=0;
IF Float_tmp=0 THEN Float_sts:= Float_sts OR 1; END_IF;

bonzay74
04.06.2019, 19:45
Да вот с радостью бы так сделал, да софтом на контроллере не я занимаюсь, у меня есть только таблица сигналов с которых надо сделать проект на панели

petera
04.06.2019, 22:51
Имеется данная панель, с контроллера получаю данные в формате float через макрос и пишу во внутреннюю переменную.
WORD ArrValue[2];
DWORD dwVar=0;
BYTE byVar1=0;
BYTE byVar2=0;
BYTE byVar3=0;
BYTE byVar4=0;
float fValue;
Reads(DOWNLOAD, 205, MODBUS_RTU_REG_4X, 20, 2, &ArrValue);
fValue = *(float*)(ArrValue);
*(float*)(PSW+300) = fValue;
byVar1 = LOBYTE(PSW[300]);
byVar2 = HIBYTE(PSW[300]);
byVar3 = LOBYTE(PSW[301]);
byVar4 = HIBYTE(PSW[301]);
PSW[500] = MAKEWORD(byVar2,byVar1);
PSW[600] = MAKEWORD(byVar4,byVar3);
dwVar=MAKEDWORD(PSW[500],PSW[600]);
*(DWORD*)(PSW+350)= dwVar;

Вопрос вот в чем, мне надо сравнить полученное значение ( с больше 0, меньше 0 и равно 0) и соответственно к примеру зажигать один из трех соответствующих внутренних битов . Но у меня никак не получается получить отрицательное значение, кто сможет подсказать , в чем моя проблема (Пробовал уже и местами менять, и то и се) ?
P.S. прошу сильно не ругаться, первый раз работаю с овеном и этой панелью.

Ну и зачем весь этот огород


........
byVar1 = LOBYTE(PSW[300]);
byVar2 = HIBYTE(PSW[300]);
byVar3 = LOBYTE(PSW[301]);
byVar4 = HIBYTE(PSW[301]);
PSW[500] = MAKEWORD(byVar2,byVar1);
PSW[600] = MAKEWORD(byVar4,byVar3);
dwVar=MAKEDWORD(PSW[500],PSW[600]);
*(DWORD*)(PSW+350)= dwVar;

читаем из контроллера сразу в переменную float, ее копируем во внутреннюю переменную PSW300 и ее же сравниваем на < = > и зажигаем PSB300 или PSB301 или PSB302

float fValue;
Read(DOWNLOAD, 205, MODBUS_RTU_REG_4X, 20, 0, TYPE_DWORD, &fValue);
*(float*)(PSW+300) = fValue;
if (fValue < 0) SetPSB(300);
else ResetPSB(300);
if (fValue == 0) SetPSB(301);
else ResetPSB(301);
if (fValue > 0) SetPSB(302);
else ResetPSB(302);


ЗЫ.
Если в PSW300 вместо, например, 5.00 вдруг увидите 2.31830817937898E-41 или 0.00, то включите в настройках порта панели эту галку
43039

bonzay74
05.06.2019, 06:23
Спасибо большое за решение.!