Просмотр полной версии : Двунаправленная обработка переменных modbus
сп310 мастер читает регистр из пр. Регистр разделён на две переменные usint(-128..127) чтобы влезть в кол-во доступных переменных пр. Отображаю обработанную макросом psw переменную, а вот как перехватить запись обработкой что то не понимаю. Прошу помощи знатоков.
сп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.
Следующий вопрос будет, почему нет отрицательных чисел 254 отображается как 254, а не -2. Даже если поставить DEC.
Отрицательные не рассматривал, т.к. "Регистр разделён на две переменные usint"
ЗЫ.
Не думаю, что ТС сможет в ОЛ использовать знаковые переменные размером в один байт
Отрицательные не рассматривал, т.к. "Регистр разделён на две переменные usint"
ЗЫ.
Не думаю, что ТС сможет в ОЛ использовать знаковые переменные размером в один байт
Спасибо. Ошибся с типом. sint конечно же с отрицательными. В ОЛ сначала перевожу во float, в том числе отрицательные. С этим всё в порядке. Вопрос разрулить часть на сп, поскольку с ними не особо работал углубленно.
Следующий вопрос будет, почему нет отрицательных чисел 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;
Наверное норм.
Но обычно как-то так:
PSW[301]=(signed char)LOBYTE(Value);
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot