PDA

Просмотр полной версии : Сенсорная панель СП310,макрос



Jerniks
22.07.2021, 08:23
Добрый день! Возник следующий вопрос, возможно ли с помощью макроса выводить сообщения на экран панели?
Например:
Mes='Авария в шкафу №....';
PSW[1000]=Mes;
и на экране панели вызвать этот регистр и там покажется заданное сообщение

Евгений Кислов
22.07.2021, 08:48
Добрый день! Возник следующий вопрос, возможно ли с помощью макроса выводить сообщения на экран панели?
Например:
Mes='Авария в шкафу №....';
PSW[1000]=Mes;
и на экране панели вызвать этот регистр и там покажется заданное сообщение

Добрый день.
Да, это возможно.

На примере строки 'Авария в шкафу №1' код макроса будет следующим:



char mes[18]="\xc0\xe2\xe0\xf0\xe8\xff\x20\xe2\x20\xf8\xea\xe0\x f4\xf3\x20\xb9\x31";
memcpy(&PSW[300], mes, 18);

1. Фактически строка занимает 17 однобайтовых символов. Поскольку панель работает с двухбайтовыми регистрами - удобнее все буферы объявлять четными (в данном случае - 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_ForumFiles/Example_MacroAsciiTextDisplay.txp

petera
22.07.2021, 10:21
Вместо
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\x f4\xf3\x20\xb9\x31 %d", Num);

Jerniks
23.07.2021, 09:11
Добрый день.
Да, это возможно.

На примере строки 'Авария в шкафу №1' код макроса будет следующим:



char mes[18]="\xc0\xe2\xe0\xf0\xe8\xff\x20\xe2\x20\xf8\xea\xe0\x f4\xf3\x20\xb9\x31";
memcpy(&PSW[300], mes, 18);

1. Фактически строка занимает 17 однобайтовых символов. Поскольку панель работает с двухбайтовыми регистрами - удобнее все буферы объявлять четными (в данном случае - 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_ForumFiles/Example_MacroAsciiTextDisplay.txp

Спасибо, помогло)

Jerniks
23.07.2021, 09:13
Вместо
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\x f4\xf3\x20\xb9\x31 %d", Num);

Спасибо, попробую использовать!

Jerniks
23.07.2021, 09:19
Возник еще один вопрос, могу ли я в данной панели с помощью инструментов: "цифровой ввода", "текстового дисплея", "текстового ввода", или с помощью макроса обращаться к области авторазмещения?
Т.е. сам туда записывать и брать оттуда значения регистров?

Евгений Кислов
23.07.2021, 09:21
Возник еще один вопрос, могу ли я в данной панели с помощью инструментов: "цифровой ввода", "текстового дисплея", "текстового ввода", или с помощью макроса обращаться к области авторазмещения?
Т.е. сам туда записывать и брать оттуда значения регистров?

Если вы не используете эту область в элементах типа Тренд, Историческая таблица и т.д. - то можете.

Jerniks
23.07.2021, 09:24
Если вы не используете эту область в элементах типа Тренд, Историческая таблица и т.д. - то можете.

а как к ней обраться с помощью макроса?

Евгений Кислов
23.07.2021, 09:33
а как к ней обраться с помощью макроса?

См. функции Reads и Writes.
Или обертки над ними:
https://owen.ru/uploads/182/example_macromemory_v2.zip

Jerniks
23.07.2021, 13:59
Если я напишу на языке пользовательскую библиотеку возможно ли ее применение для панели?

Евгений Кислов
23.07.2021, 14:01
Если я напишу на языке пользовательскую библиотеку возможно ли ее применение для панели?

Это возможно, но вам придется написать ее в редакторе кода в конфигураторе.

Jerniks
23.07.2021, 14:02
Написал в макросе функцию по справочнику
56202
выдает следующие ошибки
56203
что не так?

Евгений Кислов
23.07.2021, 14:04
Написал в макросе функцию по справочнику
56202
выдает следующие ошибки
56203
что не так?

Функции объявляются в глобальном макросе.
Прочитайте справочник внимательнее.

Можете посмотреть проект из моего предыдущего поста:
https://owen.ru/forum/showthread.php?t=35121&p=360672&viewfull=1#post360672

После этого должно стать понятно, как объявлять и вызывать свои функции.

Jerniks
27.07.2021, 07:12
Добрый день. Возник такой вопрос с помощью какой функции я могу преобразовать дату/время получаемую от ПЛК в формате DWORD?

Евгений Кислов
27.07.2021, 07:20
Добрый день. Возник такой вопрос с помощью какой функции я могу преобразовать дату/время получаемую от ПЛК в формате DWORD?

Добрый день.
Преобразовать во что?

Jerniks
27.07.2021, 07:29
Добрый день.
Преобразовать во что?

вывести на экран
Т.е. контроллер передает время события и на панели выводиться это время

Евгений Кислов
27.07.2021, 07:32
вывести на экран
Т.е. контроллер передает время события и на панели выводиться это время

См. пример: https://ftp.owen.ru/SP300/99_ForumFiles/Example_UnixtimeToFormatStrAndDigits.txp

Jerniks
27.07.2021, 07:46
См. пример: https://ftp.owen.ru/SP300/99_ForumFiles/Example_UnixtimeToFormatStrAndDigits.txp

Большое спасибо, только начинаю осваивать язык си, поэтому возможно задаю банальные вопросы)

Jerniks
27.07.2021, 14:31
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);

Евгений Кислов
27.07.2021, 14:40
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);

Потому что вы два раза объявили переменную timer.

Jerniks
28.07.2021, 09:27
Если вы не используете эту область в элементах типа Тренд, Историческая таблица и т.д. - то можете.

Подскажите пожалуйста каким образом с помощью макроса можно обратиться или записать в PFW?

Евгений Кислов
28.07.2021, 09:28
Подскажите пожалуйста каким образом с помощью макроса можно обратиться или записать в PFW?

См. функции Write и Writes.

Jerniks
28.07.2021, 13:01
56277
При загрузке проекта в панель выходит подобная ошибка

Евгений Кислов
28.07.2021, 13:13
56277
При загрузке проекта в панель выходит подобная ошибка

Потому что вы пытаетесь инициализировать глобальные переменные.

56279

Jerniks
06.08.2021, 13:17
Добрый день:) подскажите пожалуйста, переменные объявленные в глобальном макросе нужно объявлять в других макросах?

Евгений Кислов
06.08.2021, 13:33
Добрый день:) подскажите пожалуйста, переменные объявленные в глобальном макросе нужно объявлять в других макросах?

Добрый день.
Нет, не нужно - глобальные переменные доступны во всех макросах.

Jerniks
12.08.2021, 13:37
Добрый день. Подскажите пожалуйста, каким образом можно вернуть массив из функции, и как его в дальнейшем использовать?

Евгений Кислов
12.08.2021, 14:06
Добрый день. Подскажите пожалуйста, каким образом можно вернуть массив из функции, и как его в дальнейшем использовать?

Добрый день.
Вы можете в фунции записать значение в глоабальную переменную (которая может быть массивом), либо передайте в функцию указатель на массив и изменяйте значение по указателю.

Jerniks
02.09.2021, 07:45
Привет! Какое ограничение по размеру массива есть в панели?

Евгений Кислов
02.09.2021, 08:11
Привет! Какое ограничение по размеру массива есть в панели?

Добрый день.
У СП307 и СП310 - 128 Кб, у СП315 - 64 Кб.

Jerniks
16.09.2021, 11:28
Добрый день. Возникла следующая проблема... У меня в PFW память храниться типы сообщений для вывода на экран(тип string). Все сообщения из памяти(PFW) выводятся на экран, но при перезагрузке контроллера вывод некоторых сообщений становится некорректным, складывается такое ощущение что она переписывается в памяти панели, но запись данных сообщений для вывода на экран производится только с флэшки путем импорта, перезапись данных в памяти не где не происходит, только чтение для вывода, может ли панель сама перезаписывать данные в PFW памяти?

Евгений Кислов
16.09.2021, 11:39
Добрый день.


может ли панель сама перезаписывать данные в PFW памяти?

В панели, естественно, есть средства для работы с PFW - элемент Функциональная область, макросы, элементы типа Тренд и Архивирование.
При их некорректной настройке можно добиться неожиданной перезаписи PFW.


но при перезагрузке контроллера вывод некоторых сообщений становится некорректным

По этой фразе складывается ощущение, что ПЛК при загрузке отправляет в панель какие-то команды на запись.

petera
16.09.2021, 12:07
Добавлю,
Возможно для сообщений выбрана область PFW < 256
Возможно в проекте есть историческая таблица или график или тренд, использующие регистры PFW из диапазона размещения сообщений.

Jerniks
23.09.2021, 12:12
Добавлю,
Возможно для сообщений выбрана область PFW < 256
Возможно в проекте есть историческая таблица или график или тренд, использующие регистры PFW из диапазона размещения сообщений.

спасибо, так и оказалось

Jerniks
13.01.2022, 14:33
Добрый день. Подскажите пожалуйста, при экспорте данных с панели на USB носитель, данные продолжают заполнятся в эксель файле по строке с предыдущего места(например последние данные записались в ячейку А641 и при следующем экспорте они продолжают записываться дальше с ячейки А642), каким образом я могу реализовать экспорт данных с первой ячейки(начинали снова записываться с ячейки А0)?

kondor3000
13.01.2022, 16:02
Добрый день. Подскажите пожалуйста, при экспорте данных с панели на USB носитель, данные продолжают заполнятся в эксель файле по строке с предыдущего места(например последние данные записались в ячейку А641 и при следующем экспорте они продолжают записываться дальше с ячейки А642), каким образом я могу реализовать экспорт данных с первой ячейки(начинали снова записываться с ячейки А0)?

Попробуйте включить "Добавить номер после имени", файл будет каждый раз новый создаваться. 58699
Или "По дате", каждый день будет новый файл.

Jerniks
14.01.2022, 06:46
Спасибо, решил все таки сделать фиксированное имя с повтором заголовка чтобы отличать когда был произведен новый экспорт данных.

Jerniks
16.03.2022, 13:40
Добрый день. Мне необходимо реализовать таймер, который через определённое время будет сбрасывать флаг блокировки. Таймер начинает работу по определенному событию. Для начала отсчета таймера хотел взять время возникновения события из панели, хотелось бы узнать возможно ли взять локальное время панели не из системных регистров PSW[30..35], поскольку они уже разделены, а сразу время в одном DWORDE

Евгений Кислов
16.03.2022, 13:48
Добрый день. Мне необходимо реализовать таймер, который через определённое время будет сбрасывать флаг блокировки. Таймер начинает работу по определенному событию. Для начала отсчета таймера хотел взять время возникновения события из панели, хотелось бы узнать возможно ли взять локальное время панели не из системных регистров PSW[30..35], поскольку они уже разделены, а сразу время в одном DWORDE

Добрый день.
Возможно, вам подойдет счетчик системных тиков (время, прошедшее с момента включения панели)?

PSW38-39, DWORD, дискретность – 0.1 с

Jerniks
17.03.2022, 09:49
Взгляните пожалуйста на прикрепленный проект, почему переменная fBlockReading принимает значение 62? Такое ощущение складывается что у меня панель "вышла из строя", потому что я нигде не присваивал значение данной переменной

Евгений Кислов
17.03.2022, 10:03
Взгляните пожалуйста на прикрепленный проект, почему переменная fBlockReading принимает значение 62? Такое ощущение складывается что у меня панель "вышла из строя", потому что я нигде не присваивал значение данной переменной

Не могу ответить на этот вопрос, так как не знаю, где я должен увидеть "62".
Кроме того, fBlockReading - это переменная типа BOOL, если она принимает значение, отличное от 0 и 1 - то в коде есть ошибка в работе с памятью.
Вы намеренно используете только один из регистров значения тика?

kondor3000
17.03.2022, 11:25
Jerniks, почему не сделать обработку времени в ПЛК, а на панель уже отправлять бит (флаг) отработки времени?

Артур777
01.04.2022, 14:44
Добрый день! У нас имеется плк 210 и панель оператора сп315-р. Подскажите пожалуйста, как организовать таблицу аварий и предупреждений с возможностью архивирования на USB накопитель.

kondor3000
01.04.2022, 20:07
Добрый день! У нас имеется плк 210 и панель оператора сп315-р. Подскажите пожалуйста, как организовать таблицу аварий и предупреждений с возможностью архивирования на USB накопитель.

Вам надо создать новую тему и задавать свои вопросы. Вкратце, надо написать программу для ПЛК 210 и в конфигураторе СП3хх создать таблицу аварий, в которых прописать регистры (биты) аварий и передать их по ТСР/IP, то есть наладить связь между ними.

Евгений Кислов
01.04.2022, 20:11
Добрый день! У нас имеется плк 210 и панель оператора сп315-р. Подскажите пожалуйста, как организовать таблицу аварий и предупреждений с возможностью архивирования на USB накопитель.

Добрый день.
USB-накопитель будет подключен к ПЛК или к панели?

Jerniks
31.05.2022, 11:21
Добрый день. Хотелось бы по поподробнее узнать каким образом я могу написать свою библиотеку для подключения в макросе. Например, на каком языке она должна быть написана на c++ или на си, каким образом мне её подключить уже к имеющимся библиотекам в "Конфигураторе СП300" можете подробнее описать данный процесс или подсказать что нужно изучить?