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

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

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

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #60 : 28 Января 2016, 18:11:58 »
Молодец! А ардуинка какая?
« Изменён: 28 Января 2016, 18:13:04 от garry »

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #61 : 29 Января 2016, 08:52:29 »
Тестрировал все на Уно,  не думаю , что с другими будет проблемы. Попутно извиняюсь за свою назойливость , но не подскажите как работать с цифровым портом, не шим. Пробовал как в примерах вышел светодиод только гаснет , пробовал передавать led !led т.е менять состояние , но что-то отказывается работать ....

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #62 : 31 Января 2016, 12:53:24 »
Неужели никто не подскажет? В примере админа регистрируются цифровые пины, но примера работы с ними нет(((

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #63 : 31 Января 2016, 14:13:59 »
Что-то мы пропустили Ваш вопрос. С аналоговыми все как и с цифровыми ШИМ, только нужно использовать AnologRead вместо DigitalRead. А что Вы хотите сделать с светодиодом? Регулировать его яркость? Если да, то ШИМ для этого как раз и нужен. В этом его суть, он задает частоту дискретных импульсов, что и позволяет ему работать как подобие аналогового выхода.

Кстати, в Arduino Uno есть только аналоговые входы, поэтому использовать Вы их можете только для "чтения" сигналов в каких-нибудь датчиков, но не для управления.
« Изменён: 31 Января 2016, 14:16:20 от Simple-Scada »

SLR

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #64 : 31 Января 2016, 15:10:48 »
Я хочу просто включать, выключать светодиод, на цифровом порту, НЕ ШИМ. В вашем примере вы регистрируете пины
Код: (c++)
// Цифровые
int D0 = 0;
int D1 = 1;
int D2 = 2;
int D4 = 4;
int D7 = 7;
int D8 = 8;
int D12 = 12;
Дальше по коду вы описываете, как управлять ШИМ портом и читать данные с Аналоговых портов. Но про пины 0,1,2,...12. дальше по коду ничего нету.
Т.Е фактически надо давать со скады одну команду, а в ардуино инвертировать значение пина  LED = !LED.
« Изменён: 26 Мая 2018, 11:17:02 от Simple-Scada »

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #65 : 01 Февраля 2016, 11:06:45 »
Не надо ничего инвертировать, вы в цифорвой пин пишете 0 или 1, они идут со скады. В комплекте с библиотекой есть готовый пример как раз для светодиода.
Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>

/* Declaring the OPC object */
OPCSerial aOPCSerial;

/* set led status from OPC Client */
int ledPin = 13;

/* create a callback function for the OPCItem */
bool callback(const char *itemID, const opcOperation opcOP, const bool value){
  static bool ledValue = false;
 
  /* if operation is a write command from OPC Client */
  if (opcOP == opc_opwrite) {
    ledValue = value;
   
    if (ledValue) 
      digitalWrite(ledPin, HIGH);
    else
      digitalWrite(ledPin, LOW);
  }
  else
    /* read the led status  */
    return ledValue; 
}

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
 
  /* OPC Object initialization */
  aOPCSerial.setup(); 
 
  /* led OPCItem declaration */
  aOPCSerial.addItem("led",opc_readwrite, opc_bool, callback);
}

void loop() {
  /* OPC process commands */
  aOPCSerial.processOPCCommands();
}
« Изменён: 26 Мая 2018, 11:18:24 от Simple-Scada »

Borisso

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #66 : 06 Февраля 2016, 17:52:05 »
ЭЛЕМЕНТАРНОЕ!!  Не могу вывести показания температуры или простого потенциометра в Scada. Простой мониторинг порта без проблем, вывод в Scada и тишина.....!!! Arduino OPC-сервер 1.6 работает замечательно. В Simple_Scada выставлен ArduinoOPCServer.1.  Адрес, для ЕДИНСТВЕННОГО аналог.выхода ArduinoSerial0.AI0.  А в Simple-Scada ни одного значения!!!!!   Помогите пожалуйста скетчем, советом, примером!!!

albatros

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #67 : 07 Февраля 2016, 10:59:55 »
Почитайте эту тему с 20 поста вниз, у меня все получилось. Единственно мне надо было читать переменные, но основной пример у разработчика в начале схемы как раз на чтение портов.

Borisso

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #68 : 09 Февраля 2016, 16:28:38 »
Датчик температуры LM35 и обычный потенциометр. Сидят на аналоговых A0 и A1. В SimpleScada два поле под эти значения. Все показывает, НО когда потенциометр проходит отметку в 180, показания температуры начинают прыгать от 11 до 37. Ставишь потенциометр  0, температура возвращается в норму 22-23. ПОДСКАЖИТЕ как исправить это!!!!

garry

  • Пользователь
  • **
  • Сообщений: 72
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #69 : 27 Февраля 2016, 11:28:38 »
Я победил подлый OPC сервер для ардуинки!!!! Теперь можно работать с датчиками DS18B20!
Родную библиотеку  Dallastemperature - долой! Читаем напрямки, скетч под 2 датчика ниже:
Код: (c++)
#include <OPC.h>
#include <Bridge.h>
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>

OPCSerial aOPCSerial;

OneWire ds (4);
byte data[12];
byte addr1[8] = {0x28, 0xFF, 0xE0, 0x5A, 0x71, 0x15, 0x01, 0x58}; // ID индивидуально для каждого датчика
byte addr2[8] = {0x28, 0xFF, 0x83, 0x4E, 0x71, 0x15, 0x02, 0xD3};
unsigned int raw;
float temp1, temp2;

//OneWire oneWire(DS);
//DallasTemperature sensors(&oneWire);
float item_temperature1(const char *itemID, const opcOperation opcOP, const float value){
     temp1 = DS18B20(addr1);
     return  temp1;
}     
float item_temperature2(const char *itemID, const opcOperation opcOP, const float value){
     temp2 = DS18B20(addr2);
     return  temp2;
}

void setup() {
 
  Serial.begin(9600);
  aOPCSerial.setup();
  aOPCSerial.addItem("T1", opc_read, opc_float, item_temperature1);
  aOPCSerial.addItem("T2", opc_read, opc_float, item_temperature2);
}

void loop() {
  //sensors.requestTemperatures();
  aOPCSerial.processOPCCommands();
}
float DS18B20(byte *adres)
{
  ds.reset();
  ds.select(adres);
  ds.write(0x44, 1); // start conversion, with parasite power on at the end
  ds.reset();
  ds.select(adres);
  ds.write(0xBE); // Read Scratchpad

  for (byte i = 0; i < 9; i++) // можно увеличить точность измерения до 0.0625 *С (от 9 до 12 бит)
  { // we need 9 bytes
    data[i] = ds.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  float celsius =  (float)raw / 16.0;
  return celsius;
}
« Изменён: 26 Мая 2018, 11:18:42 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #70 : 27 Февраля 2016, 11:30:25 »
Достойно!  : ;)

HAyMOB

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #71 : 05 Марта 2016, 23:12:48 »
Неужели никто не подскажет? В примере админа регистрируются цифровые пины, но примера работы с ними нет(((
Пример (переписал местный для теста) для цифровых выходов (НЕ ШИМ) + проект для СКАДы, может потом кому понадобится...

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

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

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

// Цифровые ШИМ (или 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;
}


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

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

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

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

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

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

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


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

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(57600);
 
  // ОБЯЗАТЕЛЬНО!
  aOPCSerial.setup();

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

  //регистрируем цифровые для Simple-Scada, и даем им имена D2, D4... и так далее
  // эти имена нужно указывать в Simple-Scada в качестве Адреса
  aOPCSerial.addItem("D2", opc_readwrite, opc_int, D2_Item);
  aOPCSerial.addItem("D4", opc_readwrite, opc_int, D4_Item);
  aOPCSerial.addItem("D7", opc_readwrite, opc_int, D7_Item);
  aOPCSerial.addItem("D8", opc_readwrite, opc_int, D8_Item);
  aOPCSerial.addItem("D12", opc_readwrite, opc_int, D12_Item);
  aOPCSerial.addItem("D13", opc_readwrite, opc_int, D13_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(D2, OUTPUT);
  pinMode(D4, OUTPUT);
  pinMode(D7, OUTPUT);
  pinMode(D8, OUTPUT);
  pinMode(D12, OUTPUT);
  pinMode(D13, OUTPUT);
}

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

Al_Kuz

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #72 : 09 Марта 2016, 22:44:50 »
Garry и НАуМОВ спасибо за примеры, все получилось, пробовал  с китайской ноной. Вопрос к Garry, выводятся ли у Вас в Scade отрицательные значения температуры? У меня ни в какую. То ли в скетче что не так, то ли в скаде...

Код: (c++)
#include <OPC.h>
#include <OneWire.h>

OPCSerial aOPCSerial;

OneWire ds (7);
byte data[2];
unsigned int raw;

float item_temperature1(const char *itemID, const opcOperation opcOP, const float value){
         return  Read_Temp();
}     

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

void loop() {
   aOPCSerial.processOPCCommands();
}
float Read_Temp (void)
{
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44); // start conversion, with parasite power on at the end
 
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE); // Read Scratchpad

  data[0] = ds.read ();
  data[1] = ds.read ();

  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  return (float)raw / 16.0;
}
« Изменён: 26 Мая 2018, 11:19:49 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Simple-Scada и Arduino
« Ответ #73 : 09 Марта 2016, 23:03:08 »
Al_Kuz, в скаде на этот счет можете не сомневаться  ;). У Вас ведь в коде переменная raw объявлена:
Код: (c++)
unsigned int raw;
как беззнаковое целое число.
« Изменён: 26 Мая 2018, 11:20:02 от Simple-Scada »

Al_Kuz

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Simple-Scada и Arduino
« Ответ #74 : 09 Марта 2016, 23:57:22 »
Точно, так и есть. Поставил int и стало показывать минус. Спасибо, ребята! А я понадеялся на приведение типов
Код
return (float)raw / 16.0;