PDA

Просмотр полной версии : Ввод в MasterSCADA со сканера штрих-кода



Terminat
29.09.2014, 18:05
Как я понимаю, можно использовать сканер как клавиатуру для ввода непосредственно в мнемосхеме (например, через окно 'Ввод значения' у команды). Но этот вариант мне не подходит, так как вводить придется в несколько разных полей ввода в неопределенной последовательности, а оператор с беспроводным сканером будет находиться довольно далеко от АРМ.

Раздумываю над вариантами ввода другим способом. Переменную, в которую попадут данные, можно заложить в сам штрих-код. Через OPC-сервер? Если да, то какой именно, какие требования предъявлять к сканеру?

Или есть более удобные или простые варианты?

SCADAMaster
29.09.2014, 18:42
Вам действительно лучше воспользоваться ОРС сервером.
Скорее всего готовых ОРС серверов к сканерам не существует (не типовая для них задача), но ко многим сканерам есть открытый протокол, поэтому их можно подключить через наш Modbus Universal MasterOPC сервер.
Если к сканеру поставляется готовая библиотека реализации на C# (или .Net), то тогда можно получать значение через ФБ "Скрипт C#".

Terminat
10.11.2014, 16:41
Пробуем написать модуль ввода-вывода. Возникла проблема с передачей значений свойств в RTProcessor. Хотелось бы передавать, например, строку с именем COM-порта для его создания-открытия-закрытия runtime. Выбросил все лишнее:
Класс со свойством:

namespace TestModule
{
[Serializable]
public class TestModule : InternalModuleInstanceBase
{
string _comPortName = "COM1";

[DisplayName("Имя порта"), Category("Параметры порта")]
public string ComPortName
{
get { return _comPortName; }
set { _comPortName = value; }
}

public TestModule(string typeID) : base(typeID)
{
}

}
}

Класс режима исполнения:

namespace TestModule
{
public class TestModuleRTProcessor : InternalModulesRTProcessor
{
const int OutputPin = 1;

RTPinHlp _outputPin;

TestModule _testModule;

// SerialPort ComPort;

public override void Start()
{
_outputPin = GetRTPin(OutputPin);
_testModule = new TestModule("TestModule");
// MessageBox.Show("ComPort Name = " + _testModule.ComPortName, "Инфо");
// ComPort = new SerialPort(_testModule.ComPortName, 9600, Parity.None, 8, StopBits.One);
// ComPort.Open();

}

public override void Update()
{
_outputPin.SetValue(new PinValue(_testModule.ComPortName, DateTime.UtcNow));
}

public override void Dispose()
{
// ComPort.Close();
}
}

}
В примере для наглядности передаю свойство на выход, всегда получаю значение по умолчанию ("COM1"). Что делаю не так, что забыл?

SCADAMaster
11.11.2014, 20:09
Не нужно создавать новый Instance. Надо использовать свойство Instance только привести к нужному классу.
То есть будет
ComPort = new SerialPort(((TestModule)Instance).ComPortName, 9600, Parity.None, 8, StopBits.One);

Terminat
14.11.2014, 15:20
Спасибо.
И последний вопрос: использование модулей ввода вывода - не заказная опция в MasterSCADA (как базы данных, например)?

SCADAMaster
14.11.2014, 16:35
Нет, не заказная.
Точки модуля считаются как ОРС переменные.