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