Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › управление по программе из MySQL
- В этой теме 13 ответов, 5 участников, последнее обновление 1 год назад сделано MZ.
-
АвторСообщения
-
13.03.2023 в 09:57 #27665MZУчастник
Коллеги, добрый день! Прошу помощи с алгоритмом.
Задача: есть внешняя таблица в MySQL такого вида:
step time val
1 10 20
2 5 30
3 10 25
…Нужно последовательно считывать строки и выдавать управляющий сигнал (val) по модбасу в течении времени (time)(в секундах), по истечении которого брать в работу из следующей строки время и сигнал, и так далее. Или, может быть, как-то подгрузить в скаду весь массив и работать уже с ним.
Количество строк может быть произвольным, хоть 1000, и по окончании начинать с первой, с возможностью поставить цикл на паузу или начать с сначала.Прошу помощи/совета с написанием кода. Спасибо.
13.03.2023 в 10:07 #27666JurasskParkУчастникГлупый вопрос. А запись считанных значений должна идти начиная с начального регистра и меняется начальный регистр + step (число из первого столбца)?
13.03.2023 в 10:36 #27667MZУчастникДа, последовательно все строки, потом сначала.
13.03.2023 в 11:12 #27668manjey73УчастникИспользовать модуль импорта (или драйвер) например от JurasskPark
+ Модуль автоуправленияНу и написать какую-то формулу + счетчик. В зависимости от счетчика модулем автоуправления слать данные по Modbus.
з.ы. не знаю, что там у вас, но примерный путь наверное такой.
Тут зависит как увеличивать счетчик, как переходить на новый круг… ???13.03.2023 в 12:13 #27671MikhailМодераторДобрый день!
Для стандартного драйвера DrvDbImport требуется таблица с другими строками и столбцами. Поэтому варианты:
1. Использовать другой драйвер, который умеет работать с Вашим форматом таблицы.
2. Если драйвера, который удовлетворяет п.1, не существует, то разработать свой драйвер, или привести таблицу к поддерживаемому виду.13.03.2023 в 12:15 #27672MikhailМодераторвыдавать управляющий сигнал (val) по модбасу в течении времени (time)
Имеется ввиду отправлять команду через время time после момента считывания или что-то другое?
13.03.2023 в 15:23 #27676MZУчастникОтправляем команду сразу, ждем паузу(тоже вопрос, как ее задавать при помощи считанной переменной), отправляем следующую команду, ждем следующую паузу и т.д.
13.03.2023 в 16:27 #27677manjey73УчастникМодуль автоуправления и формулы, зависит от что вначале, что потом…
Паузу можно сделать в дорасчетном канале и взводить в 1 другой канал, по которому Мудуль отправит значение.Ну еще заранее подсовывать в другой канал значение, которое должен отправить модуль.
13.03.2023 в 16:28 #27678manjey73Участникнапример циклическая формула с таймером TP которая будет давать импульс в канале.
14.03.2023 в 12:26 #27680MikhailМодераторЧтобы реализовать алгоритм именно в том виде, который описал @mz, нужно разработать собственный модуль. Если делать на основе существующих модулей, то нужно записывать в таблицу значение и флаг изменения. Не добавлять новые строки, а заменять существующие. По изменению передавать команду с помощью модуля автоуправления.
Опять же, смотря какая точность по времени отправки команд требуется.28.03.2023 в 13:01 #27788MZУчастникКоллеги, добрый день!
По своей задаче уже близок к завершению, но столкнулся с проблемой.
Из mysql значения для выходной команды забрал, кладу по порядку в выделенный диапазон каналов(200-299).
Циклический таймер написал (выдает импульсы раз в заданный интервал времени).
Счетчик шагов (импульсов) сделал, когда превышает количество строк в базе, скидывается в 0.Теперь нужно в финальном выходе прописать что-то типа Val(197)==0?Val(200):Val(200+N),
где
197- текущий шаг выполнения
200- первое значение из базы данных
N-значение «счетчика» циклических импульсов, канал
200+N — подразумевается значение выхода для текущего шага из базы.Пробовал записать таким образом, не работает:
Val(197)==0?Val(200):Val(Val(200)+Val(197))
получаем:
Ошибка при компилировании исходного кода формул:
Строка 693, колонка 78: error CS1502: The best overloaded method match for ‘Scada.Server.Engine.CalcEngine.Val(int)’ has some invalid arguments
Строка 693, колонка 82: error CS1503: Argument 1: cannot convert from ‘double’ to ‘int’
Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs
Нормальная работа программы невозможнаПодскажите пожалуйста, как правильно записать номер канала в виде переменной, что бы можно было его динамически менять в алгоритме?
Спасибо.
28.03.2023 в 14:10 #27789RomirosУчастникКак-нибудь так попробуйте
Val(197)==0?Val(200):Val(Convert.ToInt32(Val(200)+Val(197)))28.03.2023 в 14:18 #27790manjey73УчастникВероятно потому что внутри номера канала не может быть формулы.
28.03.2023 в 16:37 #27791 -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.