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

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

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

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #30 : 26 Января 2016, 17:04:33 »
Опс, упустил этот момент, НО сейчас попробовал эта штука не устанавливается...

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #31 : 26 Января 2016, 17:05:31 »
А какая возникает ошибка? Если Вы работаете под Windows 7 и выше, выполняйте запуск от имени администратора.

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #32 : 26 Января 2016, 17:19:40 »
ругается на Windows Installer, у меня почему-то нету этой службы, сейчас буду разбираться, попозже отпишусь о результатах.

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #33 : 26 Января 2016, 18:38:41 »
Огромное спасибо, действительно дело оказалось в OPC companent.

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #34 : 27 Января 2016, 14:44:32 »
Появился один не большой вопрос, можно ли как то убрать следующую ситуацию :
Запускаю проект скада считывает значение температуры т=21 и тут же пишет 0. и так каждую секунду 21 0 21 0 и т.д

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #35 : 27 Января 2016, 15:03:53 »
Эту проблему можно решить очень просто. Создайте буферную переменную в которую никогда не записывайте 0. Храните в ней только реальные значения и используйте её в скаде.

Вот пример. Здесь в скаду возвращается либо текущая температура, если её удалось считать. Либо успешно считанная в последний раз температура:

Код: (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 TempBuffer = -1;

float TempItem(const char *itemID, const opcOperation opcOP, const float value){
  float t = dht.readTemperature();

  // Если температуру считать не удалось
  if ((isnan(t)) || (t < 1)) {
    return TempBuffer;
  } else
    // Если температура была успешно считана
    {
      TempBuffer = t;
      return t;
    }
}

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

  aOPCSerial.setup();
  aOPCSerial.addItem("Temperature", opc_read, opc_float, TempItem);
}

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

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #36 : 27 Января 2016, 15:21:46 »
К сожалению ничего не изменилось

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #37 : 27 Января 2016, 15:23:21 »
Вы используете именно тот код, который представлен выше? Или с какими-то изменениями? Если есть изменения, то покажите Ваш код.
« Изменён: 27 Января 2016, 15:24:17 от Simple-Scada »

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #38 : 27 Января 2016, 15:28:30 »
Использую именно ваш код (скада так же меняет значение очень быстро с нуля на реальные показания)
« Изменён: 27 Января 2016, 15:31:02 от SLR »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #39 : 27 Января 2016, 15:35:32 »
А если перенести чтение в loop-цикл, вот так:
Ещё можно попробовать раскомментировать строчку с delay.
Также в этой теме выше об одном решении писал garry. Возможно поможет отключение прерываний на момент считывания температуры.

Код: (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 TempBuffer = -1;

float TempItem(const char *itemID, const opcOperation opcOP, const float value){
    return TempBuffer;
}

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

  aOPCSerial.setup();
  aOPCSerial.addItem("Temperature", opc_read, opc_float, TempItem);
}

void loop()
{
  float t = dht.readTemperature();
 
  // Если температуру считать не удалось
  if ((isnan(t)) || (t < 1)) {
   
  } else
    // Если температура была успешно считана
    {
      TempBuffer = t;
    }

  // Здесь ещё можно сделать тесты с delay
  // delay (2000);

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

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #40 : 27 Января 2016, 15:46:52 »
Ваш код не компилируется(

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #41 : 27 Января 2016, 16:02:16 »
Ваш код не компилируется(
А подробнее, какие ошибки?

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #42 : 27 Января 2016, 16:04:20 »
ругается на
if ((isnan(t)) || (t < 1)) {
    return TempBuffer;
  } else
    // Если температура была успешно считана
    {
      TempBuffer = t;
      return t;
    }
пробовал вынести в отдельную функцию, не помогло не могу понять, что ему надо...
sketch_jan27b.ino:35:12: error: return-statement with a value, in function returning 'void' [-fpermissive]
sketch_jan27b.ino:40:14: error: return-statement with a value, in function returning 'void' [-fpermissive]

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #43 : 27 Января 2016, 16:07:16 »
Исправил код в сообщении выше.
« Изменён: 27 Января 2016, 16:09:22 от Simple-Scada »

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #44 : 27 Января 2016, 16:19:30 »
Без изменений, с делеем все понятно, если ставить задержку в  скетче то получается нулевое значение как раз на время задержки.