Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: sergey от 29 Октября 2017, 17:29:41

Название: Помощь с работой Arduino
Отправлено: sergey от 29 Октября 2017, 17:29:41
Здравствуйте, есть такая задача, считать с микроконтроллера Nano по кнопке значения с аналогового входа. При это передать количество считываем точек и период. Установил OPC сервер (использую dOPCExplorer). Там значения с разных входов отображаются и изменяются. Использую код
 
Код
#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();
}

В самой скаде добавил переменные с сервера.
Вопросы следующие:
1. Как в Скаде вывести на график или в переменную значения, так как при подстановке в переменную/адрес ничего не происходит. Попробовал построить график, он тоже ничего не выводит. Можно ли сделать, чтобы данные динамически выдавались, как они поступают с микроконтроллера. Как вобще в скаде запустить этот проект?
2. Как можно организовать передачу значений из интерфейса Скады в микроконтроллер, чтобы он считывал только необходимое количество точек. Можно ли как-то выбрать период, не используя таймера?

ИЛИ
Можно ли как-то считать данные с памяти МК и забросить в скаду и затем по ним построить график, это было бы предпочтительнее...

Буду рад, если дадите конкретные ответы или что нужно почитать.
Название: Re: Помощь с работой Arduino
Отправлено: Simple_Scada от 29 Октября 2017, 20:44:39
Здравствуйте!

Цитировать
Как в Скаде вывести на график или в переменную значения, так как при подстановке в переменную/адрес ничего не происходит. Попробовал построить график, он тоже ничего не выводит. Как вообще в скаде запустить этот проект?
Вероятно, Вы все это делаете в Редакторе (https://simple-scada.com/help/manual/editor.html)(Editor.exe), который предназначен только для разработки проекта. Подробнее о содержимом дистрибутива Simple-Scada 2 можно прочесть здесь (https://simple-scada.com/help/manual/first-steps.html). Созданный проект выполняется на Сервере (https://simple-scada.com/help/manual/server.html)(Server.exe). Клиент (https://simple-scada.com/help/manual/client.html)(Client.exe) выполняет задачи визуализации и управления, получая данные от сервера Simple-Scada. Для запуска проекта достаточно запустить Клиент Simple-Scada и нажать "Запустить проект". Отобразится список проектов - кликаем по нашему проекту и он запустится. Рекомендуем ознакомиться с демо-проектом - запустить его через клиент, посмотреть как все работает, затем открыть его в редакторе и посмотреть как все устроено.

Чтобы вывести значение переменной можно воспользоваться, например компонентом "Поле (https://simple-scada.com/help/manual/field.html)": создаем поле и указываем в свойстве "Переменная" нужную переменную. После запуска проекта в поле будет отображаться значение переменной. Не забудьте назначить переменным Шкалы (https://simple-scada.com/help/manual/edit-scale.html) - по умолчанию будет использоваться шкала 0-100. 

Если необходимо создать временный тренд(не более 1 часа) используем компонент "Временные тренды (https://simple-scada.com/help/manual/time-trends.html)". Если требуется сохранять значения переменной в архив, то у переменной настраиваем параметры архивирования (https://simple-scada.com/help/manual/index.html?variable-new.html#var_archive), затем создаем тренды (https://simple-scada.com/help/manual/editor-trends.html) и связываем их с нужными переменными. Важно! Для сохранения трендов в архив требуется установка СУБД MySQL (https://simple-scada.com/help/manual/mysql.html).

В этом видео (https://www.youtube.com/watch?v=5_LlZ_uroNc) рассмотрен процесс создания небольшого проекта.

Цитировать
Как можно организовать передачу значений из интерфейса Скады в микроконтроллер, чтобы он считывал только необходимое количество точек.
Если переменная контроллера доступна для записи, то ее значением можно управлять из объектов, например "Поле (https://simple-scada.com/help/manual/field.html)", "Уровень (https://simple-scada.com/help/manual/level.html)"(см. свойство "Доступен"), "Кнопка (https://simple-scada.com/help/manual/button.html)" и т.д., а также из скриптов (https://simple-scada.com/help/script/index.html).

Также, рекомендуем ознакомиться с часто задаваемыми вопросами (https://simple-scada.com/help/manual/faq.html).