- Se ho ben compreso ciò che ho letto in rete, in Modbus posso collegarmi sia tramite una scheda PtP (CP341) che se non erro dispone di una interfaccia con connettore a vaschetta 9 pin, che tramite un collegamento con connettori RJ45 e viaggiare sul medesimo cavo della Ethernet/Profinet: in questo caso posso utilizzare le CPU con porte RJ45 incorporata.
si, il protocollo modbus rtu/ascii può interfacciarsi indipendentemente sia su schede seriali, sia su schede ethernet/cpu profinet
- In entrambi i casi occorre acquistare una licenza per Modbus master da installare sul PLC per poter comunicare e gestire gli slave.
si, siemens prevede l'acquisto di una licenza modbus master per ogni controllore "master" presente sulla rete
- Nel caso di acquisto licenza Modbus occorre acquistarne una per ogni applicazione che intendo realizzare (tipo licenze runtime) oppure è una sola utilizzabile per più applicazioni? Mi spiego meglio: se ho tre o quattro macchine che vanno in posti differenti occorre acquistare una licenza per ogni macchina? Conoscendo Siemens questa mi pare la classica domanda retorica ).
si, ogni licenza, in teoria, dev'essere installata su una singola applicazione, sempre in teoria 8)
- Per trasmettere solamente dei dati da una CP341 all'Arduino e viceversa: tipo spedire una serie di misurazioni ogni tot minuti. Posso mandare semplicemente una stringa in seriale che poi verrà interpretata sia dall'Arduino che dal PLC? Capisco che è un sistema molto rozzo rispetto al Modbus ma era solo una curiosità per capire se è fattibile.
si, ma devi interpretare i dati da entrambe le parti, oltretutto realizzeresti una comunicazione punto-punto in RS232, considerando anche l'enorme sbattimento nella gestione di un protocollo personalizzato sia su cpu S7, sia su arduino!!!
in compenso forse ho trovato la soluzione "economica" al tuo problema:
l'idea è di utilizzare un gateway profibus-DP/CANOpen CAN in Automation (CiA): Not found ed un modulo CANOpen/SPI AvrCard.com is for sale | HugeDomains per l'interfacciamento di arduino 8)
utilizzando in aggiunta, come detto nel precedente post, un'interfaccia AD8x12bit -> I2C come questa: http://www.gravitech.us/i2c128anco.html puoi estendere di N porte le AI presenti su arduino mediante comunicazione seriale I2C.
Ti allego anche l'esempio del produttore per l'interfacciamento con arduino, sono proprio 2 righe di codice:
/******************************************************************************
Example program I2C-ADC interface with Arduino.
SETUP: I2C-ADC => Arduino
PIN7 => ground, PIN11 => A5(SCL), PIN12 => A4(SDA), PIN14 => +5V
Note: The program is written for address 0x90 (Arduino address 0x48).
This program was tested using Arduino Nano
Document: AD7828 datasheet
Updated: September 4, 2008
E-mail: support@gravitech.us
Gravitech
(C) Copyright 2008 All Rights Reserved
*******************************************************************************/
#include <Wire.h>
/*******************************************************************************
Setup
*******************************************************************************/
void setup()
{
Serial.begin(9600);
Wire.begin(); // join i2c bus (address optional for master)
delay(1000);
}
/*******************************************************************************
Main Loop
*******************************************************************************/
void loop()
{
const int I2C_address = 0x48; // I2C write address
const byte DAT[8] = {0x8C,0xCC,0x9C,0xDC,0xAC,0xEC,0xBC,0xFC};
// Constant configuration data
byte Adval_High, Adval_Low; // Store A/D value (high byte, low byte)
byte i; // Counter
delay(1000);
for (i=0; i<=7; i++)
{
Wire.beginTransmission(I2C_address);
Wire.send(DAT[i]); // Configure the device to read each CH
Wire.endTransmission();
delay(1);
// Read A/D value
Wire.requestFrom(I2C_address, 2);
while(Wire.available()) // Checkf for data from slave
{
Adval_High = Wire.receive(); // Receive A/D high byte
Adval_Low = Wire.receive(); // Receive A/D low byte
}
Serial.print("A/D value CH");
Serial.print(i, DEC);
Serial.print(" is ");
Serial.print(Adval_High,HEX);
if (Adval_Low <= 0x0F)
Serial.print("0");
Serial.println(Adval_Low,HEX);
}
Serial.println();
}
spero di esserti stato utile in qualche modo
se preferisci una comunicazione più immediata, contattami pure tramite messenger: escaflowne_01@hotmail.com
saluti
Alessandro.