В стандарте МЭК есть много полезных функций String.
В КДС есть нечто такое?
Например если мне нужно перебрать строку и удалить лишние символы.
Вид для печати
В стандарте МЭК есть много полезных функций String.
В КДС есть нечто такое?
Например если мне нужно перебрать строку и удалить лишние символы.
Поиск в Справке плохо организован.
"REAL_TO_STRING" через поиск не ищется.
А STRING_TO_REAL, DWORD_TO_REAL всё равно нет.
Пожалуйста, подскажи что я неправильно делаю.
Не работает у меня "STRING_TO_REAL"
Вложение 77867
Вложение 77868
А что хрень в V_STRING?
тип/значение. Массив какой-то
Просто переменная STRING. В ней значение объёма куб/м, надеюсь FLOAT.
Я в переменную STRING неправильно дал начальное значение?
имеет значение типа '3.4' а не тот непонятный набор символовЦитата:
Просто переменная STRING
Очень похоже, что переменная разложена на 4 байта, (234, 89, 6, 61), а число REAL там 0.03280059
А чтобы конвертировать в REAL, переменная String должна быть '0.03280059' или '0.0328'
Вам нужен конвертер во float из массива байт.
Не знаю, как там в ST на MS4D но если вы можете сделать функцию на c# то примерно так.
public single ConverToFloat(byte[] mass)
{
reuturn BitConverter.ToSingle(mass, 0);
}
з.ы. за точность синтаксиса не ручаюсь, пишу с телефона на пляже :)
И посто вызываете эту функцию, подсовывая ей байтовый массив. В Пульсоровском протоколе байты идут от младшего с старшему, вроде переставлять не надо.
Как правильно заметили, там ieee754
Наверняка в ST есть так же готовые функции преобразования из байт во float
Считав несколько переменных одним запросом вы можете добавить доп переменную в функции для индекса и изменить там на
BitConverter.ToSingle (mass, index);
И указывать индекс массива каждой требуемой переменной
Да, это из той же оперы, так сказать продолжение. Как отправить разобрался. Теперь надо понять что делать с ответом.
Число там = 0.0328006. ЗНАЧИТ Я ПРАВИЛЬНЫЕ 4 БАЙТА "ВЫРВАЛ".
Расскажите подробнее, что значит собрать согласно ieee 754 ?
Из ответа прибора я выделю эти 4 байта в стринг. А дальше как собрать?
capzap не просто вангует, он прав.
Протокол отдает массив запрашиваемых переменных в виде массива 4-х байтнвх значений .
Единственное если она float, ,то это ieee754, в наборе ещё можно оказаться так же uint32 так как тоже имеет 4 байта и это допустимо для одного запроса
Блин, неужели в ST нет аналога в MS4D?
И неужели там же нет возможности сделать FBD на C# и применять его в ST ?
Можно из 4 байт собрать 2 WORD, а потом с помощью функции собрать REAL
Функция тут, выложил capzap, REAL из двух WORD_____ https://owen.ru/forum/showthread.php?t=37203&page=10#95Код:W1:=(Byte1+shl(Byte2,8));
W2:=(Byte3+shl(Byte4,8));
В ПЛК это делается без проблем через указатели.
Пробовал собрать сразу DWORD и конвертировать в REAL, получается не правильно.
https://masteropc.insat.ru/blog/fb-s...v-masterscada/
Если в мс4д под понятием Вещественный всегда double, то просто потом привести к нему.
У вас есть средства, а вы е... с кучей преобразований из строк в байты из байтов в Ворды и т.д. Зачем?
Так я про то и написал, зачем выкручивать руки несчастным 4-м байтам, если можно один FB сделать и потом его использовать в том же ST
У вас одна строка BitConverter.ToSingle(массив байт любой длины, индек первого байта переменной float в байтов преставлении)
Если вернуть надо обязательно в double то перед просто добавить (double)BitConverter.ToSingle( и так далее)
Если вы получаете ответ от Пульсара с единственной переменной то индекс первого
К ответу выше, вам даже не придется выдергивать байты из массива байт ответа.
Второй параметр в функции BiConverter.ToSingle(массив байт, индекс) указывает на первый байт ответа, где лежит float
Если в ответе 0,1,2,3 индексы это адрес прибора
4 индекс это код команды
5 индекс это длина пакета
То с 6-го индекса начинаются переменные
Если запрашиваете больше одной, то следующий float начинается с 10-го индекса массива ответа
Следующий с 14-го и так далее
На C# будет одна рабочая строчка, остальные это оформительство C# функции для МастерСкада по их правилам, чтобы MS4 поняла, что куда будет подаваться и откуда будет выводиться.
У функции должно быть два входа.
1. Подаваемый массив байт, полученный от прибора
2. Номер индекса - указатель на первый байт из 4-х для конвертации во float
И выход - собственно значение, которое вы получите.
Если кто знает ms пусть оформит. Я беспонятия, как там писать и оформлять функции, ибо МастерСкада не использую. И лет сто использовать не буду :)
Когда у пЕсателей на первом месте интерфейс, а потом логика и удобство работы, так оно и будет.
Это надо делать в ПЛК, а не с Cкаде, присвоить по адресу в слейве ПЛК (прямая адресация, типа %QW0 или физический адрес 0)
массив из 4 байт, так как REAL, это и есть переменная из 4 байт подряд (или 2 WORD).
А в Скаде уже получите готовый REAL, по адресу 0 в который положили массив байт.
Там не ПЛК, там готовый прибор, который в пакете данных отдает 4-х байтные данные, либо float либо uint32 в зависимости от типа переменной в канале.
https://support.mps-soft.ru/Help-web...b_c_sharp.html
Справка как всегда на высоте :)
В дереве объектов создадим программу C#. Добавим в нее три параметра типов :
•Mass_Array_Of_Byte и IndexInt на клеммник входов - Как они там правильно в MS4D называются ищите, первый вход должен быть массив байт, второй просто INT число
•Znachenie на клеммник выходов - тут нужно REAL тип
public override void Execute()
{
Znachenie = BitConverter.ToSingle(Mass_Array_Of_Byte, IndexInt);
}
Ну и далее по справке создать блок или как-то там.
И вишенка на торте -
Важно! Для возможности работы С# программ в исполнительную систему должна входить опция MSRT4D-C#. Данная опция включена в базовый функционал лицензий Professional и Enterprise.
тьфу в очередной раз в это поделие. :)
я конечно тоже не ангел и делаю платные реализации, только не за такие суммы.
Вот много всяко разных советов. Но давайте поступим проще. Никакого ПЛК нет. Он не нужен. C# - не нужен.
Есть 4 байта вырванных из ответа прибора в виде STRING. Могу из них сделать ARRAY OF BYTE.
Есть язык ST. Простым языком скажите, что надо сделать с этими четырьмя байтами чтоб из всех четырёх получился один REAL?
Сложить? Умножить? Разделить? Поменять местами?
Вот тут "capzap" ванговал - он 100 пудов прав! Но как он это сделал? Он же ни C# не использовал, ни ФБ. Просто в калькуляторе сосчитал и получил правильный ответ.
Что с чем надо сделать чтоб был REAL ? Могу по битам разложить.
4 байта: 234,89,6,61. Само число известно: 0.0328006.
Да говорят же вам, ДЕЛАТЬ - ничего не надо:
Вот переменные rReal и byByte0...byByte3 которые занимают ОДНО И ТО-ЖЕ место в памяти.
Если вы смотрите на это место как на 4 байта, то там лежат 234,89,6,61.
Но если вы посмотрите на это место, как на 4-байтовый REAL - то там будет 0.03280059...
Вложение 77893
Вложение 77894
Программа даже не запущена.
Вам надо разобраться, как сделать это в ST MS4
Да вроде нормальный ST:
Вложение 77895
И функция сдвига стандартная...
прочтите документацию, например функции сдвига
Вам вообще то предлагали код формирования вещественного числа, да это сложно, но простой вариант не получится
примерно так должно получится требуемое числоКод:VAR
inpW0, inpW1 :DWORD;
stuff: ARRAY [0..3] OF BYTE := 234,89,6,61;
k : REAL;
sign : REAL;
exponent : REAL;
mant_mult : REAL;
stuffAdd : DWORD;
exp_raw : DWORD;
mantissa : DWORD;
i : INT;
negative : BOOL;
arrWToReal : REAL;
END_VAR
inpW1 :=SHL(BYTE_TO_WORD(stuff[3]),8) OR BYTE_TO_WORD(stuff[2]);
inpW0 :=SHL(BYTE_TO_WORD(stuff[1]),8) OR BYTE_TO_WORD(stuff[0]);
stuffAdd := SHL(inpW1, 16) + inpW0;
negative := SHR(stuffAdd, 31) > 0;
mant_mult := 1.0;
IF negative THEN
sign := -1.0;
ELSE
sign := 1.0;
END_IF;
exp_raw := SHR((stuffAdd MOD 2147483648), 23);
exponent := DWORD_TO_REAL(exp_raw) - 127;
mantissa := stuffAdd MOD 8388608;
FOR i := 0 TO 22 DO
IF (SHR(mantissa, (22 - i)) MOD 2) = 1 THEN
k := INT_TO_REAL(23 - (22 - i));
mant_mult := mant_mult + 1/(EXPT(2,k));
END_IF;
END_FOR;
arrWToReal := sign * (EXPT(2, exponent)) * mant_mult;
что касается этого утверждения
У Вас же получалось с ComPortByte, который сразу возвращает массив байт, поэтому все и спрашивают зачем строки
Понятно. Как потом из двух WORD собрать REAL ?
А чем ТС не устраивает объединение:
Вложение 77897
В ответном массиве куча байт, а мне нужно только 4. Поэтому вырезать их реально с помощью STRING. Есть другой способ? Подскажи.
ФБ "ComPortByte" выдаёт массив. Его в STRING и обрезаю. Ещё не делал, но думаю получится. Можно из массива сразу убрать лишнее? Подскажи.
Вот ответ
11 57 35 85 01 0E EA 59 06 3D 01 00 B9 2D
и в нём сидит цифра 0.0328006
Т.е. EA 59 06 3D
Вам сложно из массива использоовать с 6 по 9 элементы?
Вложение 77898
Не сложно. Каждый из 4-х элементов массива присвоить переменной?
Ну это уже детали. Сейчас опробую алгоритм, который Вы прислали.
Головняк, конечно, ещё тот, с этими преобразованиями. Знал, что не будет легко, но чтоб так ...