Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › как правильно достать текст
Помечено: #DecodeAscii, #ToAscii
- В этой теме 32 ответа, 3 участника, последнее обновление 4 недели назад сделано
petuhovdmitry.
-
АвторСообщения
-
23.05.2025 в 00:59 #38449
petuhovdmitry
Участник>> «SN» ваши два символа ?
Верно.> Надо не просто выставить строку и ASCII, надо еще во входной формуле
> преобразовать в строку из набора байт.https://rapidscada.net/docs/ru/latest/configuration/scripts#examples
Вот тут говорится, к примеру о функции, которую можжно поместить во входную формулу канала:
DecodeAscii(val) string Преобразует заданное значение в строку ASCII длиной до 8 символовНо, я не могу понять (найти) как верно передать ей аргумент, содержащий данные, которые нужно преобразовать из байтов в строку.
Вариации на тему DecodeAscii(val()) не отдают ничего, а DecodeAscii(Data()) роняет сервер.
-
Эта тема была изменена 1 месяц назад от
Mikhail.
23.05.2025 в 07:52 #38450manjey73
УчастникDecodeAscii(Cnl) в данном случае, прямо во входном канале из устройства.
23.05.2025 в 17:45 #38463petuhovdmitry
Участникв свойствах канала поставил галку Формула и в поле ВХ.
воткнул DecodeAscii(Cnl)
Сервер не упал, но в табличке отообразилось число 21326, то есть, не преобразованное.
Жаль,что сюда скрины нельзя прикреплять:
https://ncloud.interra.company/s/bi29S6k7g4HBY3b23.05.2025 в 18:22 #38464manjey73
УчастникТак вроде надо тогда выбрать формат — Строка и тип данных ascii раз вы формулу декодирования используете.
23.05.2025 в 18:29 #38465petuhovdmitry
УчастникТак тоже не хорошо: https://ncloud.interra.company/s/7FRJPBAcFGnS82Q
23.05.2025 в 19:23 #38467manjey73
УчастникМожете набор байт этого регистра предоставить из логов?
Может просто надо переставить байты при ответе Коммуникатора как вариант.23.05.2025 в 21:31 #38468petuhovdmitry
УчастникВот он:
Request element group «hr54»
Send (12): 00 39 00 00 00 06 01 03 00 36 00 01
Receive (7/7): 00 39 00 00 00 05 01
Receive (4/4): 03 02 53 4E
OK24.05.2025 в 19:45 #38470petuhovdmitry
Участникhttps://www.rapidtables.com/convert/number/hex-to-decimal.html?x=4E53
4E53 (20051) (NS) — это правильный результат, то есть в при получении данных я аерно указал сортировку байт 01. Осталось понять, как все же преобразовывать это в строку и отображать.24.05.2025 в 19:59 #38471manjey73
УчастникПодозреваю, что DecodeAscii работает когда байты в числе уже соответствуют ascii символам.
01 по идее не требуется указывать, оно и так вроде по умолчанию.24.05.2025 в 19:59 #38472petuhovdmitry
Участникhttps://ncloud.interra.company/s/kGZyR9WnPwoFSXM
верное значение, но преобразовать в текст не выходит.24.05.2025 в 20:00 #38473petuhovdmitry
Участникпро 01 я наврал — 10 🙂 Переворачиваем
24.05.2025 в 20:02 #38474petuhovdmitry
Участник>> Подозреваю, что DecodeAscii работает когда байты в числе
>> уже соответствуют ascii символам.этокакэто? 🙂
24.05.2025 в 20:06 #38475manjey73
УчастникДолго объяснять. Суть — modbus читает число, а не строку, а число при преобразовании далеко не похоже на представление в double формате.
24.05.2025 в 20:13 #38476petuhovdmitry
Участникда, я понимаю, что в ПЛК хранится не строка, а набор числовых значений двухбайтовых. В питоне, получив с ПЛК примерно так конвертим:
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_string24.05.2025 в 20:33 #38477petuhovdmitry
Участникгугель подсказывает, что:
В 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# ничего не нашел
-
Эта тема была изменена 1 месяц назад от
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.