управление по программе из MySQL

  • В этой теме 13 ответов, 5 участников, последнее обновление 1 год назад сделано MZ.
Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Автор
    Сообщения
  • #27665
    MZ
    Участник

    Коллеги, добрый день! Прошу помощи с алгоритмом.

    Задача: есть внешняя таблица в MySQL такого вида:

    step time val
    1 10 20
    2 5 30
    3 10 25

    Нужно последовательно считывать строки и выдавать управляющий сигнал (val) по модбасу в течении времени (time)(в секундах), по истечении которого брать в работу из следующей строки время и сигнал, и так далее. Или, может быть, как-то подгрузить в скаду весь массив и работать уже с ним.
    Количество строк может быть произвольным, хоть 1000, и по окончании начинать с первой, с возможностью поставить цикл на паузу или начать с сначала.

    Прошу помощи/совета с написанием кода. Спасибо.

    #27666
    JurasskPark
    Участник

    Глупый вопрос. А запись считанных значений должна идти начиная с начального регистра и меняется начальный регистр + step (число из первого столбца)?

    #27667
    MZ
    Участник

    Да, последовательно все строки, потом сначала.

    #27668
    manjey73
    Участник

    Использовать модуль импорта (или драйвер) например от JurasskPark
    + Модуль автоуправления

    Ну и написать какую-то формулу + счетчик. В зависимости от счетчика модулем автоуправления слать данные по Modbus.

    з.ы. не знаю, что там у вас, но примерный путь наверное такой.
    Тут зависит как увеличивать счетчик, как переходить на новый круг… ???

    #27671
    Mikhail
    Модератор

    Добрый день!
    Для стандартного драйвера DrvDbImport требуется таблица с другими строками и столбцами. Поэтому варианты:
    1. Использовать другой драйвер, который умеет работать с Вашим форматом таблицы.
    2. Если драйвера, который удовлетворяет п.1, не существует, то разработать свой драйвер, или привести таблицу к поддерживаемому виду.

    #27672
    Mikhail
    Модератор

    выдавать управляющий сигнал (val) по модбасу в течении времени (time)

    Имеется ввиду отправлять команду через время time после момента считывания или что-то другое?

    #27676
    MZ
    Участник

    Отправляем команду сразу, ждем паузу(тоже вопрос, как ее задавать при помощи считанной переменной), отправляем следующую команду, ждем следующую паузу и т.д.

    #27677
    manjey73
    Участник

    Модуль автоуправления и формулы, зависит от что вначале, что потом…
    Паузу можно сделать в дорасчетном канале и взводить в 1 другой канал, по которому Мудуль отправит значение.

    Ну еще заранее подсовывать в другой канал значение, которое должен отправить модуль.

    #27678
    manjey73
    Участник

    например циклическая формула с таймером TP которая будет давать импульс в канале.

    #27680
    Mikhail
    Модератор

    Чтобы реализовать алгоритм именно в том виде, который описал @mz, нужно разработать собственный модуль. Если делать на основе существующих модулей, то нужно записывать в таблицу значение и флаг изменения. Не добавлять новые строки, а заменять существующие. По изменению передавать команду с помощью модуля автоуправления.
    Опять же, смотря какая точность по времени отправки команд требуется.

    #27788
    MZ
    Участник

    Коллеги, добрый день!

    По своей задаче уже близок к завершению, но столкнулся с проблемой.
    Из 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
    Нормальная работа программы невозможна

    Подскажите пожалуйста, как правильно записать номер канала в виде переменной, что бы можно было его динамически менять в алгоритме?

    Спасибо.

    #27789
    Romiros
    Участник

    Как-нибудь так попробуйте
    Val(197)==0?Val(200):Val(Convert.ToInt32(Val(200)+Val(197)))

    #27790
    manjey73
    Участник

    Вероятно потому что внутри номера канала не может быть формулы.

    #27791
    MZ
    Участник

    Всё заработало при записи в такой форме:
    Val(197)==0?Val(200):Val(Convert.ToInt32(200+Val(197)))

    Спасибо!

    • Этот ответ был изменен 1 год назад от MZ.
Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Вы должны авторизироваться для ответа в этой теме.