manjey73

Ответы в темах

Просмотр 9 сообщений - с 10,066 по 10,074 (из 10,074 всего)
  • Автор
    Записи
  • manjey73
    Участник

    if (cmd.CmdTypeID == BaseValues.CmdTypes.Standard)
    {
    double can_in = cmd.CmdVal;
    int num_com = cmd.CmdNum;

    Тут формирую массив для отправки в порт

    Connection.Write(buf_com, 0, buf_com.Length); //послать запрос в порт
    System.Threading.Thread.Sleep(ReqParams.Delay);

    }
    else
    {
    WriteToLog(CommPhrases.IllegalCommand);
    }
    CalcCmdStats();

    Что и где не так ? даже попыток отправки в порт нет, абсолютно ничего. В Коммуникаторе никак не отражается на счетчик отправленных команд, никакого вывода даже в логи нет.

    В логах сервера есть «Команда ТУ отменена»

    • Ответ изменён 10 лет, 6 месяцев назад пользователем manjey73.
    manjey73
    Участник

    Михаил, можно короткий пример как принимать номер команды, тип и значение ?

    manjey73
    Участник

    C защитой понятно.
    С командами с одной стороны вроде как тоже, только при выборе типа команды «Стандартная» как вводить значения ? такого функционала я так понял нет.

    Как вообще предполагался ввод значений, кроме Вкл/Выкл в том же Modbus ?

    manjey73
    Участник

    И вопрос как защититься от неверно введенного значения ?
    Try.Parse позволяет при неправильном значении выдать 0 на выход, а значение не должно быть нулевым, например если 0, то не менять ничего.

    manjey73
    Участник

    В общем я так понял, поле команды может быть либо double (CmdVal, Cmd), либо байтовый массив (CmdData). То есть Коммуникатор или кто должен получить данные для отправки в одном из двух видов ?

    Заработала функция

    public byte[] StringToInt (byte[] val)
    {
    string s = Encoding.Default.GetString(val);
    short num;
    short.TryParse(s, out num);
    byte[] buf_out = BitConverter.GetBytes(num);
    if (BitConverter.IsLittleEndian)
    Array.Reverse(buf_out);
    return buf_out;
    }

    И формула в канале управления
    StringToInt(CmdData)

    Одно непонятно, почему пришлось переворачивать младшим байтом вперед ?

    Ввод соответственно в строковом виде.

    • Ответ изменён 10 лет, 6 месяцев назад пользователем manjey73.
    manjey73
    Участник

    Так вот и вопрос, как переопределять SendCmd чтобы он был привязан к номерам сигналов управления.

    manjey73
    Участник

    В формулах создал так, сервер при таком варианте загружается без ругани.

    public short StringToInt16 (byte[] val)
    {
    string s = Encoding.Default.GetString(val);
    short num;
    Int16.TryParse(s, out num);
    return num;
    }

    В Администраторе на канале управления указываю использовать формулу и StringToInt16(CmdData) и получаю ошибку

    2016-03-14 12:36:04 <VHPC><система><ERR> Ошибка при компилировании исходного кода формул:
    Строка 457, колонка 101: error CS0029: Неявное преобразование типа «int» в «byte[]» невозможно
    Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs

    manjey73
    Участник

    Кажется я понял из-за чего ошибки, использовались новые библиотеки Коммуникатора для работы с SNMP. И я добавлял их в ссылки из установленной scada….

    manjey73
    Участник

    1. я открываю исходники OpenKp находящиеся в ветке scada-master, если там переноса не было то почему ругается ?
    2. собрал Log, ScadaData, ScadaCommCommon, ScadaServerCommon из ветки scada-develop
    Заменил ссылки, все так же ругается на ScadaUtils и ShowError

Просмотр 9 сообщений - с 10,066 по 10,074 (из 10,074 всего)