Стартовая страница › Форумы › Понять, как работает ПО › Формулы › Выходная формула для управления
- В этой теме 19 ответов, 3 участника, последнее обновление 8 месяцев, 3 недели назад сделано
Alexandr.
-
АвторЗаписи
-
29.10.2025 в 08:40 #40899
Alexandr
УчастникВсем добрый день,
подскажите пожалуйста как записать выходную формулу в канале.
одно из значений которое требуется передать 12ED00000002Передаю данное значение через вкладку Устройство-Команда все работает, как это значение отобразить в выходной формуле в каналах не совсем пониманию.
29.10.2025 в 10:23 #40900
manjey73УчастникНужно собрать необходимый массив байт и преобразовать его в double
Попробуйте по аналогии.
public double SetEngCommXYEk1(double cmd) { if (cmd < 17 || cmd > 31) throw new Exception("Значение должно быть в пределах 17 - 31"); byte[] m = new byte[] {0x88, 0x01, (byte)((int)cmd) , 0x00, 0x00, 0x00, 0x00, 0x3C }; double ml = BitConverter.ToDouble(m, 0); SetVal(326, ml); SetVal(CnlNum,cmd); return cmd; }тут я нужное число добавляю к требуемому массиву. вам вероятно надо просто сделать потом return ml (то есть собранный вами массив). Возможно надо будет переворачивать массив, но это уже по месту разберетесь.
29.10.2025 в 10:25 #40901
manjey73Участниксама суть — собираем нужный массив, преобразовываем в double и его отправляем.
Например по кнопке «отправить команду сразу»29.10.2025 в 11:23 #40902Alexandr
УчастникManjey73,
это наверно все в скриптах требуется делать, а в выходной формуле указывать имя скрипта.
Да, придется думать что делать, в указанном Вами скрипте не совсем понимаю его логику.
Спасибо
29.10.2025 в 11:40 #40903
manjey73Участникда, в скриптах. Потом просто его вызываете в выходной.
в принципе, можно и в выходной, вложил одно действие в другое, типаBitConverter.ToDouble(new byte[] {0x88, 0x01, (byte)((int)cmd) , 0x00, 0x00, 0x00, 0x00, 0x3C }, 0)но не проверял.у меня еще там проверка на вводимое число есть.
29.10.2025 в 14:29 #40904
MikhailМодераторДобрый день!
Если речь про Модбас, попробуйте передать число
2080911654912229.10.2025 в 14:30 #40905
MikhailМодераторСделайте скриншот формы команды, которая работает через Коммуникатор.
29.10.2025 в 15:42 #40908Alexandr
УчастникМихаил, число не принимает.
Попробовал через каналы и через устройство-команда, выводит ошибку.29.10.2025 в 15:55 #40909Alexandr
УчастникМихаил, выложил три скрина.
Где через коммуникатор команда исполняется.29.10.2025 в 16:04 #40910Alexandr
Участникуправление контроллера ComAp должно проходить по регистру 4207, занимает 3 count, используется функция 16.
29.10.2025 в 16:08 #40912
manjey73Участниквам надо собрать либо 12 ED 00 00 00 02, либо добавить еще пару нулей в начале или конце при сборке double.
в общем пробовать надо.Раз из коммуникатора принимает, то и через формулу должно
29.10.2025 в 17:25 #40914Alexandr
Участникmanjey73,
в коммуникаторе, в конце значения 12 ED 00 00 00 02 добавил 00 00, так отрабатывает.
если ставить в начале то выходит ошибка команды29.10.2025 в 20:01 #40917
manjey73УчастникНу так попробуйте по моему примеру. Единственное, может массив придется заполнять с хвоста. Для битконвертера 0 байт левый.
Ещё возможно надо возвращать не double, а byte[], то есть CmdData. Посмотрите в доке по применяемым формулам. И вероятно выставить формат команды HEX или String.30.10.2025 в 16:06 #40947Alexandr
Участникmanjey73,
Подскажи пожалуйста, в каком скрипте понять значения.
я так понимаю что данный скрипт будет не совсем полный
BitConverter.ToDouble(new byte[] {0x88, 0x01, (byte)((int)cmd) , 0x00, 0x00, 0x00, 0x00, 0x3C }, 0)
и где можно почитать как происходит преобразование HEX в Byte и может быть имеется сервис онлайн для проверки скрипта.
просто пока совсем не понимаю данный скрипт.
30.10.2025 в 17:04 #40948
manjey73Участникя в таком виде не пробовал в выходной формуле делать, чисто мое предположение.
Я сделать в таблице скриптов с public у меня работает.вот еще пример записи времени в ПЛК, где были разделены регистры по году, часам и т.д.
public byte[] WriteDt() { DateTime dt = DateTime.Now; var year = BitConverter.GetBytes((ushort)dt.Year); byte[] cmdData = new byte[12] {0, (byte)dt.Second, 0, (byte)dt.Minute, 0, (byte)dt.Hour, 0, (byte)dt.Day, 0, (byte)dt.Month, 0, 0}; cmdData[10] = year[1]; cmdData[11] = year[0]; return cmdData; }здесь как раз мы возвращаем не double а массив байт.
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.