Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Chiarimenti Su Progetto Plc


Messaggi consigliati

Inserito:

Salve a tutti.

E' il primo post su questo forum, anche se vi leggo da diverso tempo. Sono abbastanza esperto in programmazione, ma assolutamente nuovo nel mondo PLC.

Vi descrivo lo scenario del progetto che vorrei realizzare:

L'obiettivo finale è la creazione di una interfaccia android (un client a tutti gli effetti) che possa comandare da remoto un plc (CPU 314C-2 DP) attraverso un server.

Voglio procedere per gradi, e quindi come primo obiettivo mi sono posto di riuscire a collegare una semplice app, scritta in c#, con il simulatore PLCSim.

Benissimo, riesco a collegarmi in diversi modi, sia tramite ethernet, sia attraverso s7online mpi etc.

Il primo ostacolo è di carattere teorico.

Vorrei scrivere sull'ingresso I124.0 (per intenderci settare il bit a zero se questo è ad uno e viceversa) mentre il PLC è in run e faccio una cosa del tipo:

PLCTag tag = new PLCTag("I124.0");
tmpConn.ReadValue(tag); if ((bool)tag.Value)
                {
                    PLCTag writeData = new PLCTag();
                    writeData.TagDataType = TagDataType.CharArray;
                    writeData.DataBlockNumber = writeDB;
                    writeData.ArraySize = writeCharArraySize;


                    string writeDataString = "Sto scrivendo una stringa.. non serve ma mi verrà utile in futuro!";
                    writeData.Controlvalue = writeDataString;


                    //Reset del Bit
                    tag.Controlvalue = false;


                    tmpConn.WriteValues(new[] { writeData, tag });
                }

C'è qualcosa che non va... nel simulatore non cambia nulla. Si possono scrivere gli ingressi mentre il PLC è in run? Cosa sto sbagliando?


Inserita:

Mi sono appena accorto di riuscire a modificare sia i bit di input che quelli di merker. Il problema è che quando il plc è in run, posso modificare solo quelli di merker. E' un comportamento normale o sbaglio qualcosa?

Grazie

Inserita:

Ciao,

ti posso rispondere per quello che riguarda quel comportamento dai blocchi PLC e non da codice C# con PLCSIm, perchè non l'ho mai fatto; il PLC legge l'immagine degli ingressi dall'hardware ad ogni scansione, prima di processare il codice applicativo dei blocchi (ladder, AWL che sia), quindi è normale, secondo me, che tu non riesca a modificarne lo stato; il merker, invece, se non è utilizzato dai blocchi, rimane pilotato; inoltre, se stoppi la CPU, la scansione, come è ovvio, si ferma; se tu riuscissi a pilotare l'ingresso ad ogni scansione della CPU, probabilmente riusciresti a pilotare anche gli ingressi: infatti, se tu scrivi in testa all'OB1 SET = I124.0 otteresti il tuo ingresso sempre ON, qualsiasi cosa legga dall'immagine degli ingressi.

Inserita:

Intanto grazie per la risposta.

Credo di aver capito cosa intendi: supponendo che il program cycle sia 100ms, io devo impostare ogni 100 ms il bit di ingresso.

Se quello che ho capito è corretto, la vedo dura tenere sta sincronizzazione.

Supponendo di avere due pulsanti che agiscono su due bit di ingresso, la cosa migliore per simularne il comportamento sarebbe di ricopiarli in due variabili merker e manipolare quelle...no?

Inserita:

Credo di aver capito cosa intendi: supponendo che il program cycle sia 100ms, io devo impostare ogni 100 ms il bit di ingresso.

Se quello che ho capito è corretto, la vedo dura tenere sta sincronizzazione.

Sì, sono daccordo: è praticamente impossibile.

Supponendo di avere due pulsanti che agiscono su due bit di ingresso, la cosa migliore per simularne il comportamento sarebbe di ricopiarli in due variabili merker e manipolare quelle...no?

Dovresti intervenire anche nel programma PLC: mettiamo che nell'OB1 tu scriva U M0.0 = I1240.0 (il 300 lo permette); se poi piloti M0.0 con il C#, ottieni che, ad ogni scansione, "forzi" (il termine è improprio, perchè per Siemens la forzatura è un'altra cosa, ma rende bene l'idea) l'ingresso nello stato che desideri.

Normalmente quando sono in test e, ad esempio, non mi hanno ancora collegato il pressostato, io "forzo" in un modo simile l'ingresso, in modo da non dover modificare troppo nel software e poter provare un "qualcosa" nel mio ciclo: non ho mai provato tramite PC e codice C#, ma, secondo me, dovrebbe funzionare ...

Inserita: (modificato)

A meno che tu non voglia fare qualcosa di particolare non è usuale, anche se possibile, scrivere sugli ingressi perchè come ti ha già detto drugo66 questi vengono sovrascritti ciclicamente dalla immagine di processo degli ingressi fisici.

Almeno, io non mi abituerei a fare questo perchè può generare parecchia confusione quando si va in stato e si vede lo stato dell'ingresso incoerente rispetto a quello del led sulla scheda, e si va subito a pensare che la scheda sia guasta.

Poi non lo nego di averlo fatto anch'io, ma solo in fase di collaudo.

Se non vuoi scrivere sui M creati una DB apposita e scrivi su quella...

ciao

Modificato: da JumpMan
Inserita:

grazie per le risposte.

Ho ancora un dubbio...

http://prntscr.com/48m0z9

Questo è il mio DB1.

La struct che address ha??

io direi 256, ma quando compilo ottengo una eccezione che mi indica che l'indirizzo è oltre i limiti del PLC.

Cosa sbaglio?

Inserita:

blocco_dati_1.struttura.intero ha indirizzo 256 ed occupa i bytes 256 e 257

blocco_dati_1.struttura.booleano ha indirizzo 258.0

Inserita:

ok... Mentre nella notazione S7, l'indirizzo dell'intero sarebbe DB1.DBW256 ?

Grazie per la pazienza

Inserita:

Piccolo aggiornamento.

Sono completamente padrone del PLC :D

Posso scrivere e leggere qualsiasi cosa in qualsiasi area di memoria. I problemi principali li ho avuti nella lettura delle strutture. In effetti nei PLC i dati sono semplicemente uno stream di byte, quindi quando scrivo una struct con 3 membri, ad es Int16|Int32|string, questi vanno letti nello stesso ordine, altrimenti si otterrà un errore nel parsing dei dati.

Ora procederò con il secondo obiettivo: esporre le funzioni con cui comando il plc in dei web services, in modo da poterli utilizzare da remoto.

Ovviamente essendo una parte di programmazione c# più che un problema relativo al PLC vi aggiornerò sui risultati enza annoiarvi con i miei dubbi e le mie domande.

Grazie per l'aiuto dato fin'ora

Inserita:

Ciao,

non mi è chiara una cosa, se posso chiedere: come fai a comunicare con il PLC tramite PLCSim con il C# ?

Per PLCSim intendi il simulatore fornito da Siemens ?

Inserita:

La comunicazione avviene tra la mia app in c# e il simulatore PLCSim fornito da siemens. In effetti potrei avere a disposizione anche un PLC reale, ma al momento ritengo più comodo muovermi con il simulatore.

La comunicazione tra app e simulatore è quasi banale. Ho addirittura provato due librerie differenti, raggiungendo l'obiettivo.

La prima libreria è elementare nel suo utilizzo, ma permette solo la comunicazione attraverso TCP over ISO (e ho dovuto usare anche nettoplcsim).

La seconda è più complessa ma permette molti più tweaks.

Io ho deciso di usare la seconda.

Ciao

Inserita:

scusa l'ignoranza ....ma credo di aver capito che tutta la libreria .NET si basa su una dll ...S7ONLINE che se non erro veniva utilzzata in libnodave .

Per far funzionare il tutto devi installare step7 o TIA Portal ? Intendo sul tuo pc dove fai girare l'applicazione C# ....?

Inserita:

in qualsiasi sistema , non solo siemens, i dati che compongono strutture piu o meno complesse sono un flusso di bytes.Infatti in molti sistemi embedded si usa creare un puntatore a byte puntando come primo indirizzo il nome della struttura .In questo modo di salvano dati , si inviano , si ricevono ect e in base al sizeof se ne conosce la dimensione e quindi l'indice per tutte queste iterazioni

comunque sarei interessato a capire qualcosa in piu riguardo questo progetto ...

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...