Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problema funzione WriteArea #26

Open
IvanLampedecchia opened this issue Oct 29, 2021 · 3 comments
Open

Problema funzione WriteArea #26

IvanLampedecchia opened this issue Oct 29, 2021 · 3 comments
Assignees
Labels
question Further information is requested

Comments

@IvanLampedecchia
Copy link

Ciao,
Sto avendo alcuni problemi con la funzione DBWrite:
In un protocollo di scambio dati tra PC e PLC che prevede l'accesso ad un DB in Lettura/Scrittura da entrambe le parti, a volte questa funzione restituisce 0 (esito positivo) anche se fisicamente sul PLC i dati non sono scritti.
Il protocollo di scambio è il seguente:

LOOP(condition)
PC=>PLC (DB1): Stringa XXXXXX (Risposta su DB1)
PLC=>PC (DB2): Stringa XXXXXXXXX (Risposta su DB2)
PC=>PLC(DB1): Stringa ------ (Reinizializza stringa con carattere predefinito)
PC=>PLC(DB2): Stringa ------ (Reinizializza stringa con carattere predefinito)
END LOOP

Ho momentaneamente tamponato questo problema con un meccanismo di Scrittura=>Rilettura=>Retry.

Avendo poca esperienza con questo protocollo fatico a comprendere se il problema sia dato dalla funzione che esce prematuramente o dal PLC che fa qualche scherzetto.

@fbarresi fbarresi added the question Further information is requested label Nov 1, 2021
@fbarresi fbarresi self-assigned this Nov 1, 2021
@fbarresi
Copy link
Owner

fbarresi commented Nov 1, 2021

Hi!

Capisco il problema. Potresti darmi altri indizi per aiutarti?

  • Hai una PLC ed un PC, giusto?
  • Cosa intendi come risposta su DB2? Che la tua PLC scrive su Sharp7 Server o semplicemente su un'altra DB?
  • Il software che realizza questo scambio di information tra PC e PLC usa Sharp7 anche per leggere o scrivere altre aree o variabili?
  • Quando si presenta il problema? Saresti in grado di riprodurlo?

Il problema che descrivi mi sembra dovuto a thread-safety.
Purtroppo Sharp7 è molto low-level e non è tread-safe di per sé: c'é un semplice socket di comunicazione e ogni azione viene eseguita attraverso lo stesso canale e la plc può eseguirne una alla volta in maniera procedurale.

Per sapere se il problema è dovuto a questo potresti provare a isolare il tuo loop e vedere se riesci a riprodurre il problema.

In Sharp7Reactive abbiamo risolto il problema con un LimitedConcurrencyLevelTaskScheduler.

Saluti,
FB

@IvanLampedecchia
Copy link
Author

IvanLampedecchia commented Nov 2, 2021 via email

@josbri
Copy link

josbri commented Feb 1, 2022

Hi,
If I understand correctly, I am having the same problem. It will fail to write to the PLC when using the AreaWrite method, yet it will still return a 0 (like it was written).

This will happen randomly and not very often but it is a critical failure, since we cannot know if the variable was written properly. Reading the variable just after does not work either, since it could have been modified from another source.
We write to the same db in the plc just before this happens, but it´s all done sequentially and not over multiple threads.

Example:

  • 11:36:47.166 : Write int 0 to db XXXX, start 22 >>> Returns 0, it´s written to plc.
  • 11:36:47.233: Write byte 6 to db XXXX (same as before), start 4 >>> Returns 0, it´s NOT written to plc.

As I said, this works most of the times, but still fails some of them.

Please let me know if more information is needed, or if any help is needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants