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

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

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

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #15 : 06 Января 2016, 22:28:08 »
Какая у Вас версия Arduino IDE? Есть разработки по Arduino Mega Server, так у них разные версии IDE по разному работают.  И еще сбросьте пожалуйста библиотеку DHT, которая у Вас, их сейчас много вариантов. Больше ничего в голову не приходит.
PS Еще вспомнил- я на Меге катаюсь.
« Изменён: 06 Января 2016, 22:37:22 от garry »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #16 : 07 Января 2016, 09:46:49 »
Мы используем версию 1.6.5, но если бы дело было в этом, или в библиотеке DHT.h, то в стандартном примере тоже ничего не работало бы. И ещё мы тестируем все на Arduino Uno, а не Mega. Для теста интересно было бы узнать какой результат даст этот код:

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

OPCSerial aOPCSerial;

#define DHTPIN 2
#define DHTTYPE DHT21

DHT dht(DHTPIN, DHTTYPE);

float D2_t = -1;
float D2_h = -1;

float D2_TItem(const char *itemID, const opcOperation opcOP, const float value){
  float t = dht.readTemperature();
  if (isnan(t)) {
    return D2_t;
  } else
    {
      D2_t = t;
      return t;
    }
}

float D2_HItem(const char *itemID, const opcOperation opcOP, const float value){
  float h = dht.readHumidity();
  if (isnan(h)) {
    return D2_h;
  } else
    {
      D2_h = h;
      return h;
    }
}

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

  aOPCSerial.setup();

  aOPCSerial.addItem("D2_t", opc_read, opc_float, D2_TItem);
  aOPCSerial.addItem("D2_h", opc_read, opc_float, D2_HItem);
}

void loop()
{
  aOPCSerial.processOPCCommands();
}

Что в этом случае отображается в скаде? Значения равные -1?
« Изменён: 26 Мая 2018, 11:12:48 от Simple-Scada »

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #17 : 07 Января 2016, 10:18:27 »
Значений нет. Вот лог с OPC сервер
Код
07.01.2016 10:12:46 > Running OPC Server from C:\ArduinoOPCServer_1_6\ArduinoOPCServer.exe
07.01.2016 10:12:46 > Waiting for OPC clients to connect....
07.01.2016 10:12:46 > Connected client
07.01.2016 10:12:46 > Trying to open COM3 port
07.01.2016 10:12:46 > COM3 port open
07.01.2016 10:12:46 > Asking for available OPCItems from ArduinoSerial0
07.01.2016 10:12:46 > Frame: <0,D2_t,0,3,D2_h,0,3>
2
07.01.2016 10:12:46 > Returned OPC Items ms:16
07.01.2016 10:12:57 > Client asks for: D2_h
07.01.2016 10:12:57 > Not frame received for D2_h
07.01.2016 10:13:38 > Client asks for: D2_h
07.01.2016 10:13:38 > Not frame received for D2_h
07.01.2016 10:13:40 > Client asks for: D2_t
07.01.2016 10:13:40 > Not frame received for D2_t
07.01.2016 10:14:31 > Connected client
07.01.2016 10:14:31 > Asking for available OPCItems from ArduinoSerial0
07.01.2016 10:14:31 > Frame: <0,D2_t,0,3,D2_h,0,3>
2
07.01.2016 10:14:31 > Returned OPC Items ms:31
07.01.2016 10:14:31 > Client asks for: D2_h
07.01.2016 10:14:31 > Not frame received for D2_h
07.01.2016 10:14:31 > Client asks for: D2_h
07.01.2016 10:14:31 > Not frame received for D2_h
07.01.2016 10:14:31 > Client asks for: D2_t
07.01.2016 10:14:31 > Received D2_t value OK. Returned frame:20.00 length:5 Frame: 32302E3030
07.01.2016 10:14:31 > Client asks for: D2_t
07.01.2016 10:14:31 > Not frame received for D2_t
07.01.2016 10:14:35 > Client asks for: D2_h
07.01.2016 10:14:35 > Not frame received for D2_h
07.01.2016 10:14:35 > Client asks for: D2_t
07.01.2016 10:14:35 > Not frame received for D2_t
07.01.2016 10:14:37 > Client asks for: D2_h
07.01.2016 10:14:37 > Not frame received for D2_h
07.01.2016 10:14:37 > Client asks for: D2_t
07.01.2016 10:14:37 > Not frame received for D2_t
07.01.2016 10:14:39 > Client asks for: D2_h
07.01.2016 10:14:39 > Not frame received for D2_h
07.01.2016 10:14:39 > Client asks for: D2_t
07.01.2016 10:14:39 > Not frame received for D2_t
07.01.2016 10:14:41 > Client asks for: D2_h
07.01.2016 10:14:41 > Not frame received for D2_h
07.01.2016 10:14:41 > Client asks for: D2_t
07.01.2016 10:14:41 > Not frame received for D2_t
07.01.2016 10:14:43 > Client asks for: D2_h
07.01.2016 10:14:43 > Not frame received for D2_h
07.01.2016 10:14:43 > Client asks for: D2_t
07.01.2016 10:14:43 > Not frame received for D2_t
07.01.2016 10:14:45 > Client asks for: D2_h
07.01.2016 10:14:45 > Not frame received for D2_h
07.01.2016 10:14:45 > Client asks for: D2_t
07.01.2016 10:14:45 > Not frame received for D2_t
07.01.2016 10:14:47 > Client asks for: D2_h
07.01.2016 10:14:47 > Not frame received for D2_h
07.01.2016 10:14:47 > Client asks for: D2_t
07.01.2016 10:14:47 > Not frame received for D2_t
07.01.2016 10:14:49 > Client asks for: D2_h
07.01.2016 10:14:49 > Not frame received for D2_h
07.01.2016 10:14:49 > Client asks for: D2_t
07.01.2016 10:14:49 > Not frame received for D2_t
07.01.2016 10:14:51 > Client asks for: D2_h
07.01.2016 10:14:51 > Not frame received for D2_h
07.01.2016 10:14:51 > Client asks for: D2_t
07.01.2016 10:14:51 > Not frame received for D2_t
07.01.2016 10:14:53 > Client asks for: D2_h
07.01.2016 10:14:53 > Not frame received for D2_h
07.01.2016 10:14:53 > Client asks for: D2_t
07.01.2016 10:14:53 > Not frame received for D2_t
07.01.2016 10:14:55 > Client asks for: D2_h
07.01.2016 10:14:55 > Not frame received for D2_h
07.01.2016 10:14:55 > Client asks for: D2_t
07.01.2016 10:14:55 > Not frame received for D2_t
07.01.2016 10:14:57 > Client asks for: D2_h
07.01.2016 10:14:57 > Not frame received for D2_h
07.01.2016 10:14:57 > Client asks for: D2_t
07.01.2016 10:14:57 > Not frame received for D2_t
07.01.2016 10:14:59 > Client asks for: D2_h
07.01.2016 10:14:59 > Not frame received for D2_h
07.01.2016 10:14:59 > Client asks for: D2_t
07.01.2016 10:14:59 > Not frame received for D2_t
07.01.2016 10:15:01 > Client asks for: D2_h
07.01.2016 10:15:01 > Not frame received for D2_h
07.01.2016 10:15:01 > Client asks for: D2_t
07.01.2016 10:15:01 > Not frame received for D2_t
07.01.2016 10:15:03 > Client asks for: D2_h
07.01.2016 10:15:03 > Not frame received for D2_h
07.01.2016 10:15:03 > Client asks for: D2_t
07.01.2016 10:15:03 > Not frame received for D2_t
07.01.2016 10:15:05 > Client asks for: D2_h
07.01.2016 10:15:05 > Not frame received for D2_h
07.01.2016 10:15:05 > Client asks for: D2_t
07.01.2016 10:15:05 > Not frame received for D2_t
07.01.2016 10:15:07 > Client asks for: D2_h
07.01.2016 10:15:07 > Not frame received for D2_h
07.01.2016 10:15:07 > Client asks for: D2_t
07.01.2016 10:15:07 > Not frame received for D2_t
07.01.2016 10:15:07 > Disconnected client Simple-Scada OPC client
Судя по логу, один раз температура ушла.
« Изменён: 07 Января 2016, 10:19:49 от garry »

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #18 : 07 Января 2016, 12:43:38 »
Решение пришло неожиданно. Меня заинтересовало, что в цикле loop внесение задержки delay от 150 и выше вызывало нулевые показания на выходе и(или) прекращение отдачи данных , при delay ниже 150 показания не отдавались вообще или отдавались однократно. Как мне подумалось тут что-то нечисто с прерываниями, по моему они как-то затрагивают таймер, работающий с delay, а именно он, как я где-то читал, часто используется в библиотеке DHT. В общем я на время получения данных решил запретить прерывания, а потом разрешить. ВУАЛЯ- ЗАРАБОТАЛО!
Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>
#include "DHT.h"

OPCSerial aOPCSerial;

#define DHTPIN 2
#define DHTTYPE DHT21

DHT dht(DHTPIN, DHTTYPE);

float D2_t = -1;
float D2_h = -1;

float D2_TItem(const char *itemID, const opcOperation opcOP, const float value){
  noInterrupts();
  float t = dht.readTemperature();
  interrupts();
  if (isnan(t)) {
    return D2_t;
  } else
    {
      D2_t = t;
      return t;
    }
}

float D2_HItem(const char *itemID, const opcOperation opcOP, const float value){
  noInterrupts();
  float h = dht.readHumidity();
  interrupts();
  if (isnan(h)) {
    return D2_h;
  } else
    {
      D2_h = h;
      return h;
    }
}

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

  aOPCSerial.setup();

  aOPCSerial.addItem("D2_t", opc_read, opc_float, D2_TItem);
  aOPCSerial.addItem("D2_h", opc_read, opc_float, D2_HItem);
}

void loop()
{

  aOPCSerial.processOPCCommands();
}


Есть у меня подноздрения, что подобный костыль в скетче с далласовскими датчиками решит проблему, т.к. в их библиотеке delay-ев, наверное, как на собаке блох.
« Изменён: 26 Мая 2018, 11:13:05 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #19 : 07 Января 2016, 14:17:25 »
Интересное решение!

albatros

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #20 : 19 Января 2016, 11:40:39 »
 Добрый день.
 В программировании полный ноль, так что не судите строго.
Решил подцепить вашу Scada к своему проекту. Перед этим загрузил ваш скетч, все работает. По образцу вашего кода ввел для эксперимента в свой проект код для двух переменных. Так как проект большой, то выкладываю только код для этих двух переменных _gtv1 и _gtv2.

Код: (c++)
int _gtv1 = 15;
int _gtv2 = 75;

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

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

  aOPCSerial.addItem("_gtv1", opc_read, opc_int, _gtv1_Item);
  aOPCSerial.addItem("_gtv2", opc_read, opc_int, _gtv2_Item);

Реальные параметры для _gtv1 и _gtv2: 26 и 28 соответственно, что у меня отображается на LCD дисплее.
При подключении Scada вижу такую картину:



В dOPC Explorer вид такой:


Причем эти показания не статичные, а меняются для первой переменной примерно с 580 до 590, для второй 798-799.
В dOPC Explorer цифры немного другие.
А должно быть 26 и 28.
Можете-ли вы мне подсказать что я делаю не так.
« Изменён: 26 Мая 2018, 11:13:20 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #21 : 19 Января 2016, 11:51:31 »
Здравствуйте!

То что Вы видите в Simple-Scada - это аналоговые значения на пинах номер 15 и номер 75 соответственно, которые возвращает функция analogRead. При помощи этой функции Arduino просто преобразовывает входной сигнал от 0 до 5 вольт в свою вирутальную шкалу от 0 до 1023. Т.е. шкала [0..5V] соответствует шкале [0..1023 ед.]. А Вы уже должны преобразовывать шкалу для своих нужд. В Simple-Scada для этого у некоторых компонентов есть свойства визуальной шкалы (виз.минимум, виз.максимум). Например у компонента "Поле" или "Уровень". И Вы можете использовать эти свойства, чтобы преобразовать полученные числа к нужным значениям.

В итоге, Вы можете поставить компонент поле и указать в нём минимум = 0, максимум = 1023, виз.минимум = 0, виз. максимум = максимальному значению с датчика. Т.е. если у Вас датчик температуры от 0 до 80, то и виз. максимум должен быть 80.
« Изменён: 19 Января 2016, 11:57:49 от Simple-Scada »

albatros

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #22 : 19 Января 2016, 12:02:17 »
Вот не ожидал такого быстрого отклика, спасибо!
А как мне получить значение переменной _gtv1?, а не входа номер 15. Дело в том что программу я писал в FDB, СИ я просто не знаю. 15 и 75 это предустановленные значения переменных _gtv1 и _gtv2, которые потом меняются с клавиатуры, сейчас эти параметры у меня выставлены 26 и 28, как мне их увидеть в Scada?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #23 : 19 Января 2016, 12:03:35 »
Очень просто, для этого вы должны писать так, не используя analogRead:

Код: (c++)
int _gtv1_Item(const char *itemID, const opcOperation opcOP, const int value){
  return _gtv1;
}
« Изменён: 26 Мая 2018, 11:13:32 от Simple-Scada »

albatros

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #24 : 19 Января 2016, 12:08:54 »
Спасибо огромное, буду пробовать.
Как с обидой говорит один мой знакомый когда у него в очередной раз ничего не получается: - Ну да, когда знаешь, тогда легко. :D

albatros

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #25 : 19 Января 2016, 15:12:34 »
Спасибо, с чтением все получилось, а как поменять значение этой переменной в контроллере из Scada. В редакторе в колонке Доступ стоит чтение и запись, меняю значение в Scada, но значение не меняется.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #26 : 19 Января 2016, 15:27:30 »
Для записи нужно изменить функцию вот так:

Код: (c++)
int _gtv1_Item(const char *itemID, const opcOperation opcOP, const int value){
  // Если Simple-Scada пытается записать новое значение в _gtv1
  if (opcOP == opc_opwrite) {
    _gtv1 = value;
  }

  return _gtv1;
}
« Изменён: 26 Мая 2018, 11:13:46 от Simple-Scada »

albatros

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #27 : 19 Января 2016, 16:42:52 »
 Много разных платных продуктов использовал, но такой поддержки нигде не встречал. Вы лучшие!
 Спасибо, все получилось. Закончу проект, выложу скрины в соответствующей ветке.

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #28 : 26 Января 2016, 16:35:35 »
Добрый день, 2ой день мучаюсь ничего не получается, делаю все в точности как в вашей инструкции, заливаю ваш код. Сервер регистрируется, НО, в ItemProperty выбираю ArduinoOOPSServer.1 жму коннект выскакивает "interface not supported" вот лог из ArduinoOPCServer
Код
26.01.2016 20:29:55 > Running OPC Server from G:\opc\ArduinoOPCServer.exe
26.01.2016 20:29:55 > Waiting for OPC clients to connect....
26.01.2016 20:30:10 > Connected client
26.01.2016 20:30:10 > Trying to open COM3 port
26.01.2016 20:30:10 > COM3 port open
26.01.2016 20:30:10 > Asking for available OPCItems from ArduinoSerial0
26.01.2016 20:30:10 > Frame: <0,MyVirtualItem,2,1,D3,2,2,D5,2,2,D6,2,2,D9,2,2,D10,2,2,D11,2,2,AI0,0,2,AI1,0,2,AI2,0,2,AI3,0,2,AI4,0,2,AI5,0,2>
13
26.01.2016 20:30:10 > Returned OPC Items ms:140
Соответственно в simple-scade вставляю объект поле привязываю адрес ArduinoSerial0.AI0, в настройках скады опс сервер вижу, запускаю проект и поле с крестом.... Подскажите , что делать, куда копать.
« Изменён: 26 Мая 2018, 11:14:03 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #29 : 26 Января 2016, 16:37:03 »
Здравствуйте!

А Вы установили OPC Core Components?