теперь уже не важно написано где-то или нет) что мне с этим делать? придется самому побитово пересобирать REAL из LREAL и обратно?
Вид для печати
теперь уже не важно написано где-то или нет) что мне с этим делать? придется самому побитово пересобирать REAL из LREAL и обратно?
в справке имеется замечание по поводу работы длинного реала
А как поступить, можно воспользоваться поиском, у Вас не первого же встречается такая проблема
Нашел вот это. Библиотеку в КДС3 подключить не смог. А код товарища vitiali по моему не совсем верен.
в частности мне не совсем понятно это условие:
Написал свои функции для преобразования LREAL в REAL:Код:IF mant>0 THEN (*чтобы при нулевой мантисе не вылизло какое-нибудь число*)
expon:=expon-1023;
expon:=expon+127; (*если мантиса больше 0 экспон. приймет значения *)
END_IF
и обратно:Код:FUNCTION LREAL2REAL : REAL
VAR_INPUT
IN: LWORD;
END_VAR
VAR
lwMant: LWORD;
lwExpon: LWORD;
lwSign: LWORD;
lwREAL: LWORD;
pREAL: POINTER TO REAL;
END_VAR
lwMant:=SHR(IN,29) AND 16#7FFFFF;
lwExpon:=SHR(IN,52) AND 16#7FF;
IF lwExpon<896 THEN
lwExpon:=0;
ELSIF lwExpon>1151 THEN
lwExpon:=255;
ELSE
lwExpon:=lwExpon+127-1023;
END_IF
lwExpon:=SHL(lwExpon,23);
lwSign:=SHR(IN,32) AND 16#80000000;
lwREAL:=lwMant OR lwExpon OR lwSign;
pREAL:=ADR(lwREAL);
LREAL2REAL:=pREAL^;
Код:FUNCTION REAL2LREAL : LWORD
VAR_INPUT
IN: REAL;
END_VAR
VAR
lwMant: LWORD;
lwExpon: LWORD;
lwSign: LWORD;
pIN: POINTER TO LWORD;
aIN: ARRAY [0..1] OF REAL;
END_VAR
aIN[0]:=IN;
pIN:=ADR(aIN);
lwMant:=SHL(pIN^ AND 16#7FFFFF,29);
lwExpon:=SHL((SHR(pIN^,23) AND 16#FF)+1023-127,52);
lwSign:=SHL(pIN^ AND 16#80000000,32);
REAL2LREAL:=lwMant OR lwExpon OR lwSign;
Новая проблема с Modbus.
Пытаюсь настроить обмен двух контроллеров по ModbusTCP. В слейве указываю нужное кол-во регистров на чтение и запись:
Вложение 22926
делаю соотнесение входов и выходов с соответствующими массивами, которые будут использоваться в качестве буферов:
Вложение 22927
и тут возникает вопрос: а мастеру по каким адресам надо обращаться?
В слейве не нашел где указан адрес (начальный адрес регистров чтения/записи). Где-то читал, что одни регистры начинаются с адреса 2000, другие с 3000, но какие именно не помню, и вообще к ПЛК/КДС это относилось ли. Сейчас этот документ найти не могу.
На "странице конфигурации" вроде как есть нужные поля, но они почему-то затенены.
Еще не понятно вот это:
А если мне надо передать 1000 регистров?Цитата:
Регистры временного хранения – определяют количество holding регистров
канала. Параметр может принимать значения от 2 до 40 (см. рис. 11.25);
Входные регистры – определяют количество input регистров канала. Параметр
может принимать значения от 2 до 40 (см. рис. 11.25).
Предположим регистры %IW начинаются с 0, а %QW тогда с какого? Тоже с 0?
так то их требуется опрашивать разными функциями модбаса почему бы и нет, проверить то трех минут достаточно
А, похоже дошло.
Если мастер делает запрос с командой 03 и адресом регистра 0, то он обращается к регистрам IW (временного хранения).
Если команда 04 и адрес 0, то он читает регистры QW (входные).
Если команда 16 и адрес 0, то запись регистров QW.
Так?
а что с 1000 регистров делать? Для каждых 40 регистров отдельное устройство создавать?
по логике, да. Но если не пойдет попробуйте стучаться по адресам которые выставили в настройках, вдруг это не количество а адресация :)Цитата:
Если мастер делает запрос с командой 03 и адресом регистра 0, то он обращается к регистрам IW (временного хранения).
Если команда 04 и адрес 0, то он читает регистры QW (входные).
Если команда 16 и адрес 0, то запись регистров QW.
Так?