Добрый день! Возник следующий вопрос, возможно ли с помощью макроса выводить сообщения на экран панели?
Например:
Mes='Авария в шкафу №....';
PSW[1000]=Mes;
и на экране панели вызвать этот регистр и там покажется заданное сообщение
Вид для печати
Добрый день! Возник следующий вопрос, возможно ли с помощью макроса выводить сообщения на экран панели?
Например:
Mes='Авария в шкафу №....';
PSW[1000]=Mes;
и на экране панели вызвать этот регистр и там покажется заданное сообщение
Добрый день.
Да, это возможно.
На примере строки 'Авария в шкафу №1' код макроса будет следующим:
1. Фактически строка занимает 17 однобайтовых символов. Поскольку панель работает с двухбайтовыми регистрами - удобнее все буферы объявлять четными (в данном случае - 18).Код:char mes[18]="\xc0\xe2\xe0\xf0\xe8\xff\x20\xe2\x20\xf8\xea\xe0\xf4\xf3\x20\xb9\x31";
memcpy(&PSW[300], mes, 18);
2. Элементы Текстовый дисплей/Текстовый ввод в панели используют кодировку Win1251
2. В макросах нельзя использовать кириллицу, поэтому используется экранирующие последовательности (https://en.wikipedia.org/wiki/Escape_sequences_in_C)
\x - это спецсимвол, который указывает на то, что следующие два символа надо трактовать как HEX-значение (в качестве которого мы указываем ASCII-код символа)
4. Для перевода кириллической строки в ASCII-коды удобно использовать онлайн-конвертер, например: http://crypt-online.ru/crypts/text2hex/
Но могут быть нюанс - например, конвертер по ссылке неправильно конвертирует символ №.
5. После выполнения макроса записанная строка займет регистры PSW300-308
https://ftp.owen.ru/SP300/99_ForumFi...extDisplay.txp
Вместо
memcpy(&PSW[300], mes, 18);
можно использовать стандартную функцию sprintf()
и сразу "печатать" в Текстовый дисплей, например PSW[1000], нужной длины.
Типа
sprintf((char*)&PSW[1000], "My Text");
Поддерживается форматирование. Например печать даты времени (дата и время в регистрах PSW30..PSW35 в двоично-десятичном формате)
sprintf((char*)&PSW[1000], "%4X-%2.2X-%2.2X %2.2X:%2.2X:%2.2X ", PSW[30], PSW[31], PSW[32], PSW[33], PSW[34], PSW[35]);
Вложение 56159
Печатаем в Текстовый дисплей PSW[1000] (десять регистров PSW1000...PSW1009)
Вложение 56160
Результат - строка вида 2021-07-22 13:36:15
Для задачи ТС, с учетом отсутствия кириллицы
int Num;
Num = 10;
sprintf((char*)&PSW[1000], "\xc0\xe2\xe0\xf0\xe8\xff\x20\xe2\x20\xf8\xea\xe0\ xf4\xf3\x20\xb9\x31 %d", Num);
Возник еще один вопрос, могу ли я в данной панели с помощью инструментов: "цифровой ввода", "текстового дисплея", "текстового ввода", или с помощью макроса обращаться к области авторазмещения?
Т.е. сам туда записывать и брать оттуда значения регистров?
См. функции Reads и Writes.
Или обертки над ними:
https://owen.ru/uploads/182/example_macromemory_v2.zip
Если я напишу на языке пользовательскую библиотеку возможно ли ее применение для панели?
Написал в макросе функцию по справочнику
Вложение 56202
выдает следующие ошибки
Вложение 56203
что не так?
Функции объявляются в глобальном макросе.
Прочитайте справочник внимательнее.
Можете посмотреть проект из моего предыдущего поста:
https://owen.ru/forum/showthread.php...l=1#post360672
После этого должно стать понятно, как объявлять и вызывать свои функции.
Добрый день. Возник такой вопрос с помощью какой функции я могу преобразовать дату/время получаемую от ПЛК в формате DWORD?
Вложение 56268
выдает данные ошибки, при компиляции кода:
#include <stdio.h>
#include <time.h>
#include <stddef.h>
int time_t;
int timer;
time_t timer;
char buffer[26];
struct tm* tm_info;
timer = *(DWORD*)(PSW+2604);
tm_info = localtime(&timer);
strftime (buffer, 26, "%Y-%m-%d %H:%M:%S",tm_info);
memcpy (&PSW[850],buffer, 24-2);
Вложение 56277
При загрузке проекта в панель выходит подобная ошибка
Потому что вы пытаетесь инициализировать глобальные переменные.
Вложение 56279
Добрый день:) подскажите пожалуйста, переменные объявленные в глобальном макросе нужно объявлять в других макросах?
Добрый день. Подскажите пожалуйста, каким образом можно вернуть массив из функции, и как его в дальнейшем использовать?
Привет! Какое ограничение по размеру массива есть в панели?
Добрый день. Возникла следующая проблема... У меня в PFW память храниться типы сообщений для вывода на экран(тип string). Все сообщения из памяти(PFW) выводятся на экран, но при перезагрузке контроллера вывод некоторых сообщений становится некорректным, складывается такое ощущение что она переписывается в памяти панели, но запись данных сообщений для вывода на экран производится только с флэшки путем импорта, перезапись данных в памяти не где не происходит, только чтение для вывода, может ли панель сама перезаписывать данные в PFW памяти?
Добрый день.
В панели, естественно, есть средства для работы с PFW - элемент Функциональная область, макросы, элементы типа Тренд и Архивирование.Цитата:
может ли панель сама перезаписывать данные в PFW памяти?
При их некорректной настройке можно добиться неожиданной перезаписи PFW.
По этой фразе складывается ощущение, что ПЛК при загрузке отправляет в панель какие-то команды на запись.Цитата:
но при перезагрузке контроллера вывод некоторых сообщений становится некорректным
Добавлю,
Возможно для сообщений выбрана область PFW < 256
Возможно в проекте есть историческая таблица или график или тренд, использующие регистры PFW из диапазона размещения сообщений.
Добрый день. Подскажите пожалуйста, при экспорте данных с панели на USB носитель, данные продолжают заполнятся в эксель файле по строке с предыдущего места(например последние данные записались в ячейку А641 и при следующем экспорте они продолжают записываться дальше с ячейки А642), каким образом я могу реализовать экспорт данных с первой ячейки(начинали снова записываться с ячейки А0)?
Попробуйте включить "Добавить номер после имени", файл будет каждый раз новый создаваться. Вложение 58699
Или "По дате", каждый день будет новый файл.
Спасибо, решил все таки сделать фиксированное имя с повтором заголовка чтобы отличать когда был произведен новый экспорт данных.
Добрый день. Мне необходимо реализовать таймер, который через определённое время будет сбрасывать флаг блокировки. Таймер начинает работу по определенному событию. Для начала отсчета таймера хотел взять время возникновения события из панели, хотелось бы узнать возможно ли взять локальное время панели не из системных регистров PSW[30..35], поскольку они уже разделены, а сразу время в одном DWORDE
Взгляните пожалуйста на прикрепленный проект, почему переменная fBlockReading принимает значение 62? Такое ощущение складывается что у меня панель "вышла из строя", потому что я нигде не присваивал значение данной переменной