Подключение к SCADA через Arduino OPC (usb-serial)
- Войдите на сайт для отправки комментариев
Вс, 22/01/2017 - 21:21
Здраавствуйте, пытаюсь настроить работу со SCADA SimpLight посредством Arduino OPC по USB. Удалось получить данные от датчика DS18B20 и вывести переменную в OPC. Но в самой SCADA показания "прыгают".
Например, время опроса 1 с. В мониторе последовательного порта получаю значение 12.78. При этом в SCADA наблюдаю изменение показания примерно в таком порядке 21.78; 78; 0; 1,78; 21,7..
Где может скрываться проблема? Код для работы c датчиком сгенерирован FLProg, потому несколько нечитабельный.
#include <OneWire.h>
#include <OPC.h>
#include <Bridge.h>
#include <SPI.h>
OPCSerial aOPCSerial;
byte _d18x2x1Addr[8] = {0x28, 0xFF, 0x54, 0x1E, 0x88, 0x16, 0x3, 0xC};
OneWire _ow2(2);
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
unsigned int raw;
float temp1;
float item_temperature1(const char *itemID, const opcOperation opcOP, const float value) {
temp1 = _d18x2x1O;
return temp1;
}
void setup()
{
Serial.begin(9600);
Serial.println("Start temperature measurement");
aOPCSerial.setup();
aOPCSerial.addItem("T1", opc_read, opc_float, item_temperature1);
}
void loop()
{
aOPCSerial.processOPCCommands();
Serial.println (_d18x2x1O);
if (_isTimer(_d18x2x1Tti, 1000)) {
_d18x2x1Tti = millis();
_d18x2x1O = _readDS18_ow2(_d18x2x1Addr, 0);
}
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime >= startTime) {
return (currentTime >= (startTime + period));
} else {
return (currentTime >= (4294967295 - startTime + period));
}
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
int16_t raw = (data[1] << 8) | data[0];
if (type_s)
{
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1;
}
return (float)raw / 16.0;
}
float _readDS18_ow2(byte addr[8], byte type_s)
{ byte data[12];
byte i;
_ow2.reset();
_ow2.select(addr);
_ow2.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = _ow2.read();
}
_ow2.reset();
_ow2.select(addr);
_ow2.write(0x44, 1);
return _convertDS18x2xData(type_s, data);
}

Похожие картинки выдает SCADA SCADA24 или view24 http://view24.org .
Что за функция item_temperature1? Объявлена с параметрами, вызывается без параметров.
Какого качество тэгов? Если не будет признака качества будет лажа всякая.
Пробуйте по частям, не температуру сразу выводить, а чтобы хоть константу нормально увидел opc. Попробуйте для интереса не float а целые передавать.
И еще раз связь идкт через USB значит эта opc библиотека использует serial0 и вы его тоже используете... Это так для размышления.