Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Simple-Scada и Arduino  (Прочитано 76621 раз)

Андрей

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Simple-Scada и Arduino
« : 09 Октября 2015, 04:01:29 »
Всем привет!
Хотелось бы подружить Simple-scada и Arduino например uno для презентации одного проекта. Для начала подключил к uno ds18b20 12 порт, скачал библиотеку OPC, код ниже. uno подключено по usb-serial COM5.  При посылке T в консоль, получаю температуру. Настраиваю scada: в свойствах обьекта тэк прописал T, в настройках OPC-сервер Компьютер: localhost, OPC-сервер что прописать? Если прописать COM5 не работает... побывал найти OPC с помощью ItemProperty Есть у кого то примеры? Или я что то не то делаю?

Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OPCSerial aOPCSerial;

int DS = 12;
OneWire oneWire(DS);
DallasTemperature sensors(&oneWire);
int item_bool(const char *itemID, const opcOperation opcOP, const int value){
             sensors.requestTemperatures();
     return  sensors.getTempCByIndex(0);
}

void setup() {
  Serial.begin(9600);
  aOPCSerial.setup();
  aOPCSerial.addItem("T",opc_read, opc_bool, item_bool);
}

void loop() {
  aOPCSerial.processOPCCommands();
}
« Изменён: 26 Мая 2018, 11:07:59 от Simple-Scada »

Andrey1883

  • Пользователь
  • **
  • Сообщений: 68
    • Просмотр профиля
Re: Simple-scada и Arduino
« Ответ #1 : 09 Октября 2015, 10:56:21 »
Хм..интересный вариант :) у самого ардуино валяется, планировал изучить и замутить проект умный дом ...так руки и не дошли :D ...порылся в инете и вот, что нашел ...или можно тут глянуть...народ использует Modbus (даже библиотеки готовые есть для ардуино) ну и ОРС, который работает с Modbus, насколько я понимаю :)

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Simple-scada и Arduino
« Ответ #2 : 09 Октября 2015, 12:35:37 »
Здравствуйте!

Мы успешно работали с Arduino Uno через Simple-Scada. Все делается достаточно просто. Можно легко сделать какую-то домашнюю автоматизацию и пр. Опишем все по шагам.

  • Скачайте Arduino OPC-сервер 1.6 с этого сайта. Распакуйте архив и запустите от имени администратора пакетный файл "register.bat". После этого сервер должен успешно зарегистрироваться. Но у нас была проблема, когда регистрация не проходила из-за того, что Arduino OPC-сервер располагался в папке с русскоязычным названием. После перемещения в другую директорию регистрация прошла успешно;
  • Убедитесь, что Arduino OPC-сервер успешно зарегистрировался. Для этого откройте Редактор Simple-Scada, создайте новый проект и перейдите в меню "Проект - Настройки". Там Вы должны увидеть "ArduinoOPCServer.1", его и нужно выбрать для разработки проекта. Если его не видно, значит он неправильно зарегистрирован;
  • Запустите конфигуратор Arduino и напишите нужный Вам код. Пример правильного кода для Arduino Uno (с нашими комментариями) смотрите ниже. Скомпилируйте его и загрузите в Arduino Uno;
  • В проект Simple-Scada добавьте какой-то объект. Например, Поле. Укажите адрес в соответствии с именем переменной заданной в коде. Но адрес должен быть полным, например: ArduinoSerial0.AI0 . Используйте ItemProperty для того, чтобы не ошибиться с адресом;
  • Готово!

Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>

// это переменная для работы с OPC
OPCSerial aOPCSerial;

// сигнальный диод
int diod = 13;

// Цифровые
int D0 = 0;
int D1 = 1;
int D2 = 2;
int D4 = 4;
int D7 = 7;
int D8 = 8;
int D12 = 12;

// Цифровые ШИМ (или PWM)
int D3 = 3;
int D5 = 5;
int D6 = 6;
int D9 = 9;
int D10 = 10;
int D11 = 11;

// Аналоговые входа
int AI0 = 0;
int AI1 = 1;
int AI2 = 2;
int AI3 = 3;
int AI4 = 4;
int AI5 = 5;

// Это пример объявления виртуальной переменной, которая будет видна в
// Simple-Scada и её значение будет равно 99
byte MyVirtualItem(const char *itemID, const opcOperation opcOP, const byte value){
  return 99;
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Далее описаны процедуры которые описывают работу с Цифровыми ШИМ (PWM) входами

int D3_Item(const char *itemID, const opcOperation opcOP, const int value){
  // если Simple-Scada хочет записать новое значение
  if (opcOP == opc_opwrite) {
    analogWrite(D3, value);
  }
   
  return analogRead(D3);
}

int D5_Item(const char *itemID, const opcOperation opcOP, const int value){
  // если Simple-Scada хочет записать новое значение
  if (opcOP == opc_opwrite) {
    analogWrite(D5, value);
  }
   
  return analogRead(D5);
}

int D6_Item(const char *itemID, const opcOperation opcOP, const int value){
  // если Simple-Scada хочет записать новое значение
  if (opcOP == opc_opwrite) {
    analogWrite(D6, value);
  }
   
  return analogRead(D6);
}

int D9_Item(const char *itemID, const opcOperation opcOP, const int value){
  // если Simple-Scada хочет записать новое значение
  if (opcOP == opc_opwrite) {
    analogWrite(D9, value);
  }
   
  return analogRead(D9);
}

int D10_Item(const char *itemID, const opcOperation opcOP, const int value){
  // если Simple-Scada хочет записать новое значение
  if (opcOP == opc_opwrite) {
    analogWrite(D10, value);
  }
   
  return analogRead(D10);
}

int D11_Item(const char *itemID, const opcOperation opcOP, const int value){
  // если Simple-Scada хочет записать новое значение
  if (opcOP == opc_opwrite) {
    analogWrite(D11, value);
  }
   
  return analogRead(D11);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Далее описываются процедуры для чтения значений Аналоговых входов

int AI0_Item(const char *itemID, const opcOperation opcOP, const int value){
  return analogRead(AI0);
}

int AI1_Item(const char *itemID, const opcOperation opcOP, const int value){
  return analogRead(AI1);
}

int AI2_Item(const char *itemID, const opcOperation opcOP, const int value){
  return analogRead(AI2);
}

int AI3_Item(const char *itemID, const opcOperation opcOP, const int value){
  return analogRead(AI3);
}

int AI4_Item(const char *itemID, const opcOperation opcOP, const int value){
  return analogRead(AI4);
}

int AI5_Item(const char *itemID, const opcOperation opcOP, const int value){
  return analogRead(AI5);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


void setup()
{
  Serial.begin(9600);
 
  // ОБЯЗАТЕЛЬНО!
  aOPCSerial.setup();

  // для примера объявляем виртуальный тег, который всегда = 99
  aOPCSerial.addItem("MyVirtualItem", opc_readwrite, opc_byte, MyVirtualItem);

  //регистрируем цифровые ШИМ (PWM) для Simple-Scada, и даем им имена D3, D5... и так далее
  // эти имена нужно указывать в Simple-Scada в качестве Адреса
  aOPCSerial.addItem("D3", opc_readwrite, opc_int, D3_Item);
  aOPCSerial.addItem("D5", opc_readwrite, opc_int, D5_Item);
  aOPCSerial.addItem("D6", opc_readwrite, opc_int, D6_Item);
  aOPCSerial.addItem("D9", opc_readwrite, opc_int, D9_Item);
  aOPCSerial.addItem("D10", opc_readwrite, opc_int, D10_Item);
  aOPCSerial.addItem("D11", opc_readwrite, opc_int, D11_Item);

  // регистрируем аналоговые входа для Simple-Scada, называя их AI0, AI1... и так далее
  //  эти имена нужно указывать в Simple-Scada в качестве Адреса
  aOPCSerial.addItem("AI0", opc_read, opc_int, AI0_Item);
  aOPCSerial.addItem("AI1", opc_read, opc_int, AI1_Item);
  aOPCSerial.addItem("AI2", opc_read, opc_int, AI2_Item);
  aOPCSerial.addItem("AI3", opc_read, opc_int, AI3_Item);
  aOPCSerial.addItem("AI4", opc_read, opc_int, AI4_Item);
  aOPCSerial.addItem("AI5", opc_read, opc_int, AI5_Item);
 
  pinMode(diod, OUTPUT);
}

void loop()
{
  // ОБЯЗАТЕЛЬНО! Выполняем OPC-команды в цикле
  aOPCSerial.processOPCCommands();
}
« Изменён: 26 Мая 2018, 11:07:43 от Simple-Scada »

Андрей

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #3 : 12 Октября 2015, 09:11:27 »
Спасибо за подробнейший ответ. Скада работает, не сразу увидел что register.bat создается и его нужно запустить, а еще да на русском не стоит создавать проект. Прога ItemProperty отказывалась подключатся к OPC серверу, пока не установил opc-core-components и MatrikonOPC Explorer. Не понял какая из них помогла. Появилась другая проблема, ds18b20 не отдает данные по OPC, в лог пишет Not frame received, если кто знает решение напишите плиз.

janga

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #4 : 31 Октября 2015, 09:12:52 »
помогла описикор.
не отдает и у меня,пришлось похерить проект.хотя на эмуляции все работает.

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #5 : 25 Декабря 2015, 09:11:26 »
С ds18b20 у кого-то получилось? У меня та-же печалька.
« Изменён: 25 Декабря 2015, 09:15:17 от garry »

Андрей

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #6 : 30 Декабря 2015, 07:44:54 »
Нет. У меня так и не заработало с даласом, библиотеки не совместимы, допиливать нужно. Писал сюда http://www.st4makers.com/support-forum-arduino-opc-server/146-ds18b20-opc разработчик тоже молчит.

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #7 : 30 Декабря 2015, 15:47:01 »
Досадно, придется по модбасу прикручивать. А идея с ардуиновским сервером была чертовски хороша.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #8 : 30 Декабря 2015, 16:17:13 »
Андрей, а почему в Вашем коде команда "sensors.requestTemperatures();" стоит в функции "int item_bool"? Это и есть запрос на чтение температуры, а значит температура будет считана в скаду лишь единожды - во время запуска, ведь событие OnDataChange для температуры больше не выполнится. Поэтому эта строка должна быть в цикле loop.

дополнено: моя ошибка, все же не обязательно ставить requestTemperatures в цикл, ведь в Вашем случае команда будет выполняться при каждом опросе тега со скады и это в целом нормально. Но все-таки правильнее было бы поместить его в loop

Цитировать
У меня так и не заработало с даласом, библиотеки не совместимы, допиливать нужно.
Почему Вы говорите о несовместимости библиотек? Как мы поняли температура все таки передается в скаду. Но проблема в том, что передается только один раз. Если это так, значит дело может быть не в скаде или датчике, а в коде, который используется для чтения температуры.

Также непонятно почему Вы добавляете тег на OPC как "opc_bool", температура это ведь не 0 или 1, а аналоговое значение. Затем при чтении вы используете int (целочисленный тип), хотя лучше бы это был float (вещественный тип), ведь getTempCByIndex возвращает именно float.

В результате должно получиться вот что:

Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OPCSerial aOPCSerial;

int DS = 12;
OneWire oneWire(DS);
DallasTemperature sensors(&oneWire);
float item_temperature(const char *itemID, const opcOperation opcOP, const float value){
     return  sensors.getTempCByIndex(0);
}

void setup() {
  Serial.begin(9600);
  aOPCSerial.setup();
  aOPCSerial.addItem("T", opc_read, opc_float, item_temperature);
}

void loop() {
  sensors.requestTemperatures();
  aOPCSerial.processOPCCommands();
}
Возможно это не решит Вашу проблему, но этот код правильнее. И скажите, передается ли температура в скаду хотя бы один раз?
« Изменён: 26 Мая 2018, 11:08:49 от Simple-Scada »

janga

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #9 : 03 Января 2016, 15:51:10 »
Поставил OPC-Arduino, зарегил, SCADA увидела и добавила в список выбора новый OPC,но потом дичь вылазить-запускаю item property и подключаюсь к ардуиносерверу - в итоге выскакивает неостанавливаемый список дебагов винды, который не остановить даже диспечтером.Что это может быть? Винда 7 32-bit.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #10 : 03 Января 2016, 16:00:34 »
Это просто ошибка OPC-сервера Arduino. Item Property запрашивает у OPC-Arduino список тегов и соответственно OPC-сервер пытается сформировать этот список, но не может, так как тегов нет, или нет подключения к устройству. Если мы не ошибаемся, проблему можно решить если подключить Arduino к компьютеру, скомпилировать проект с одним или более тегов и загрузить его на устройство. После этого Arduino OPC-сервер должен нормально работать с Item-Property.
« Изменён: 03 Января 2016, 16:01:09 от Simple-Scada »

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #11 : 06 Января 2016, 18:30:23 »
Пробую передачу температуры и влажности с DHT21. Не идет. Код простой как лом.
Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT21

DHT dht(DHTPIN, DHTTYPE);

OPCSerial aOPCSerial;

float callbackh(const char *itemID, const opcOperation opcOP, const float value){
  return dht.readHumidity();
}

float callbackt(const char *itemID, const opcOperation opcOP, const float value){
  return dht.readTemperature();
}

void setup() {
  Serial.begin(9600);
  dht.begin();

  aOPCSerial.setup();
 
  aOPCSerial.addItem("h",opc_read, opc_int, callbackh);
  aOPCSerial.addItem("t",opc_read, opc_int, callbackt);
}

void loop() {
  //delay (2000); //для экспериментов, если раскомментить идут нули

  aOPCSerial.processOPCCommands();
}
« Изменён: 26 Мая 2018, 11:09:18 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #12 : 06 Января 2016, 19:52:36 »
Странно это, у нас все работает с датчиком температуры/влажности DHT11, используя такой код:

Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>
#include "DHT.h"

OPCSerial aOPCSerial;

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

float TCallback(const char *itemID, const opcOperation opcOP, const float value){
    return dht.readTemperature();
}

float HCallback(const char *itemID, const opcOperation opcOP, const float value){
    return dht.readHumidity();
}

void setup()
{
  Serial.begin(9600);
  dht.begin();

  aOPCSerial.setup();
  aOPCSerial.addItem("t", opc_read, opc_float, TCallback);
  aOPCSerial.addItem("h", opc_read, opc_float, HCallback);
}

void loop()
{
  aOPCSerial.processOPCCommands();
}
А не через скаду, т.е. средствами Arduino температура/влажность успешно считываются?
« Изменён: 26 Мая 2018, 11:09:32 от Simple-Scada »

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #13 : 06 Января 2016, 21:46:10 »
Не работает. Ваш скетч  то-же самое. Ну заменил в параметрах итема  opc_int на opc_float - ничего. Прошил вашим скетчем - ничего. Чудеса! В стандартном примере в сериал все отдает.
Че делать-то. Свихнусь ведь скоро! На LM35 переходить?
« Изменён: 06 Января 2016, 21:49:17 от garry »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #14 : 06 Января 2016, 22:20:59 »
Видимо есть ещё какие-то причины такого поведения. Датчик ведь рабочий, значит мы что-то упускаем. Должен же быть какой-то источник у этой проблемы. Вот только идей по его обнаружению пока не возникает.