Ответы в темах
-
АвторЗаписи
-
petuhovdmitry
Участниквозможно правильнее будет к ulong приводить.
Предлагаете поправить в скрипте?
petuhovdmitry
Участник> Сдается что один регистр это две буквы, а остальные 8 это уже просто число.
Да, четыре числа, хранящиеся в отдельных ячейках регистра.Этот пример — это версия прошивки ПЛК.
Должна бы выглядять как: 1.0.5.114.NSПока нашел допустимым выводить в табличке, как:
Версия прошивки ПЛК | 105.114
Суффикс версии прошивки ПЛК | NSДалее, нужно будет научится выводить GTIN (14 цифр), дату производства (DD.MM.YYYY), партию (может содержать не только цифры)
https://ncloud.interra.company/s/HEqAmtpK6DenaRSНу, и вишенкой на торте — код маркировки, который 31+ символов
petuhovdmitry
Участник> Сделайте шаблон чтения вашей строки,
> читая как double по 8 байт сразу.
> И лог запроса и ответа сюда.
Пришлось сделать ulong, потому, что с double ничего не приходилоRequest element group «hr_50-54»
Send (12): 01 4C 00 00 00 06 01 03 00 32 00 05
Receive (7/7): 01 4C 00 00 00 0D 01
Receive (12/12): 03 0A 00 01 00 00 00 05 00 72 53 4E
OKи при этом:
| **************************** hr_50-54 ***************************** |
+——+—————+—————+———————+———+
| 61 | elem50-53 | elem50-53 | 281 474 977 038 450 | |
+——+—————+—————+———————+———+
| 62 | elem54-54 | elem54-54 | 21 326 | |
+——+—————+—————+———————+———+petuhovdmitry
Участник>> Нет, не можете. Посмотрите формулы, поймете.
>> Длина данных = 8 + Scada создаст массив каналовЭто значит, что я в принципе в табличных представлениях не смогу, например, отобразить (и хранить изменения) GTIN продукта (14 цифр), не говоря уж о Коде маркировки 31+ символов, номер партии, который может быть 8+ символов, не раскладывая это по восьмибайтным кускам?
petuhovdmitry
УчастникКстсти, я могу вместо Val(43) указать Val(код_тэга)?
-
Ответ изменён 1 год, 4 месяца назад пользователем
petuhovdmitry.
petuhovdmitry
Участник>> с 100 регистра (сами там смотрите с какого)
Понял, попробую.>> Потом делаете расчетный канал с длиной 8, 9, 10 сколько требуется.
Тут странно. Я создал расчетный канал ascii string. Размер его по-умолчанию, как я поняд — 8 символов.
Запихнул туда (вход): Val(43).ToString() + Val(44).ToString() + Val(45).ToString() + Val(46).ToString()и скада мне в табличке отобразила только 8 символов. если я в диълине данных канала укажу какое нибудь сисло, например двойку, то скада в табличке дважды отобразит мне результат работы входной формулы 🙂
petuhovdmitry
УчастникPLC Delta AS228T данные типа STRING хранит в двухбайтовых регистрах.
Как я их запихну?petuhovdmitry
УчастникДоброго!
Много ли воды утекло с тех пор?Вот к чему вопрос. Я пытаюсь выстроить внешний мониторинг процесса работы системы валидации кодов маркировки на линии фасовки продукции. Для этого, хорошо бы, получать складывать на хранение значения полученных кодов маркировки с камеры техзрения. С нее я умею по модбасу получать код маркировки длиной 31+ ASCII-символов (16+ даухбайтовых ячеек из регистра хранения). Но, далее, мне понадобится собрать этот код из 16+ двухбайтовых каналов, сцепить и записать в расчетный канал. Понятное дело, что для этого в скаде, нужно будет настроить хренения в PostgreSQL. Сие возможно нынче?
petuhovdmitry
Участникhttps://ncloud.interra.company/s/3o28CM2TzqLwBte
Отлично, то что нужно, спасибо!
Уверен, что этот опыт будет и другим полезен.petuhovdmitry
Участникили нужно сначала закинуть это в кастомный скрипт?
petuhovdmitry
Участник>> немного другая формула для этого — ToAscii
а что передать в нее? ToAscii(Cnl) роняет скадуpetuhovdmitry
Участникгугель подсказывает, что:
В C#, чтобы преобразовать шестнадцатеричную строку в обычную строку, используйте метод System.Text.Encoding.ASCII.GetString() или System.Text.Encoding.UTF8.GetString(). Сначала шестнадцатеричную строку нужно преобразовать в массив байтов, а затем преобразовать этот массив байтов в строку.
using System;
using System.Text;public class HexToText
{
public static void Main(string[] args)
{
string hexString = «48656c6c6f20576f726c64»; // Пример шестнадцатеричной строки «Hello World»
string result = HexToString(hexString);
Console.WriteLine(result); // Вывод: Hello World
}public static string HexToString(string hexString)
{
// Удаляем префикс «0x» (если он есть)
if (hexString.StartsWith(«0x»))
{
hexString = hexString.Substring(2);
}// Преобразуем шестнадцатеричную строку в массив байтов
byte[] bytes = new byte[hexString.Length / 2];
for (int i = 0; i < bytes.Length; i++)
{
string byteString = hexString.Substring(i * 2, 2);
bytes[i] = byte.Parse(byteString, System.Globalization.NumberStyles.HexNumber);
}// Преобразуем массив байтов в строку
return Encoding.UTF8.GetString(bytes);
}
}про DecodeAscii в контексте C# ничего не нашел
petuhovdmitry
Участникда, я понимаю, что в ПЛК хранится не строка, а набор числовых значений двухбайтовых. В питоне, получив с ПЛК примерно так конвертим:
def convert_controller_ascii_data_to_string(self, data: list, reverse=False):
«»»Конвертируем массив, полученный от контроллера в строку»»»
try:
if reverse:
byte_order = ‘little’
else:
byte_order = ‘big’
data_array_converted = [value.to_bytes(2, byteorder=byte_order).decode(‘utf-8’) for value in data]
data_string = «».join(data_array_converted)
data_string = data_string.replace(‘\x00’, »)
except:
self.logger.error(f»Не получилось конвертировать ascii массив {data} от контроллера в строку»)
raise Exception(f»Не получилось конвертировать ascii массив {data} от контроллера в строку»)
return data_stringpetuhovdmitry
Участник>> Подозреваю, что DecodeAscii работает когда байты в числе
>> уже соответствуют ascii символам.этокакэто? 🙂
petuhovdmitry
Участникпро 01 я наврал — 10 🙂 Переворачиваем
-
Ответ изменён 1 год, 4 месяца назад пользователем
-
АвторЗаписи