PDA

Просмотр полной версии : Двунаправленная обработка переменных modbus



PavelGO
21.01.2023, 22:52
сп310 мастер читает регистр из пр. Регистр разделён на две переменные usint(-128..127) чтобы влезть в кол-во доступных переменных пр. Отображаю обработанную макросом psw переменную, а вот как перехватить запись обработкой что то не понимаю. Прошу помощи знатоков.

petera
22.01.2023, 06:52
сп310 мастер читает регистр из пр. Регистр разделён на две переменные usint(-128..127) чтобы влезть в кол-во доступных переменных пр. Отображаю обработанную макросом psw переменную, а вот как перехватить запись обработкой что то не понимаю. Прошу помощи знатоков.

Например так
65333

здесь байты из регистра 4х512 выделяются в одну пару регистров, например, PSW300 и PSW301,
а ввод осуществляется в другую пару регистров, например, PSW400 и PSW401

65334

Цифровые вводы имеют биты уведомления, от которых запускаются ф.области

65335 65336

kondor3000
22.01.2023, 11:45
Следующий вопрос будет, почему нет отрицательных чисел 254 отображается как 254, а не -2. Даже если поставить DEC.

petera
22.01.2023, 12:55
Следующий вопрос будет, почему нет отрицательных чисел 254 отображается как 254, а не -2. Даже если поставить DEC.

Отрицательные не рассматривал, т.к. "Регистр разделён на две переменные usint"

ЗЫ.
Не думаю, что ТС сможет в ОЛ использовать знаковые переменные размером в один байт

PavelGO
22.01.2023, 18:27
Отрицательные не рассматривал, т.к. "Регистр разделён на две переменные usint"

ЗЫ.
Не думаю, что ТС сможет в ОЛ использовать знаковые переменные размером в один байт
Спасибо. Ошибся с типом. sint конечно же с отрицательными. В ОЛ сначала перевожу во float, в том числе отрицательные. С этим всё в порядке. Вопрос разрулить часть на сп, поскольку с ними не особо работал углубленно.

PavelGO
26.01.2023, 22:31
Следующий вопрос будет, почему нет отрицательных чисел 254 отображается как 254, а не -2. Даже если поставить DEC.

Как я понимаю, в макросе нужно смотреть 7й бит и если он тру, выставлять старшие 8 бит в тру. Работает, но нет ли подводных камней, знаток?
WORD Value=0;
BYTE B0=0;
BYTE B1=0;

BYTE const255=255;
Read(PLC, 1, MODBUS_RTU_REG_3X, 525, 0, TYPE_WORD, &Value);

B0=LOBYTE(Value);
B1=HIBYTE(Value);

if (B0>127) {
Value=MAKEWORD(B0,const255);
}else
{
Value=B0;
}


PSW[301]=Value;

Валенок
27.01.2023, 01:00
Наверное норм.
Но обычно как-то так:
PSW[301]=(signed char)LOBYTE(Value);