Vai al contenuto
PLC Forum


Dati "shiftati" In Comunicazione Ethernet Tra Cpu


Gapo

Messaggi consigliati

Ciao a tutti,

sto provando a scambiare dei dati tra due CPU (nello stesso progetto) via ethernet, utilizzando le AG_SEND e AG_RECV.

Ho inserito le CP343-1 nell'hardware (hanno indirizzo 1000 in entrambe le CPU), ho impostato gli indirizzi IP, e ho definito il collegamento in NetPro (il collegamento ha ID2).

Ho definito in entrambe le CPU la DB11 di test fatta nel seguente modo:

STRUCT

continuos_increase : INT ;

integer_test_01 : INT ;

integer_test_02 : INT ;

integer_test_03 : INT ;

integer_test_04 : INT ;

END_STRUCT ;

Dopodiché ho inserito in una CPU la AG_SEND

CALL FC 5 (

ACT := clock_1s,

ID := 2,

LADDR := W#16#3E8,

SEND := P#DB11.DBX0.0 BYTE 10,

LEN := 10,

DONE := M 90.0,

ERROR := M 90.1,

STATUS := MW 92);

e nell'altra la AG_RECV

L 10;

T MW 14;

CALL FC 6 (

ID := 2,

LADDR := W#16#3E8,

RECV := P#DB11.DBX0.0 BYTE 10,

NDR := M 90.0,

ERROR := M 90.1,

STATUS := MW 92,

LEN := MW 14);

Ora, la comunicazione sembrerebbe funzionare, se non fosse che sulla CPU "ricevente" mi ritrovo i dati "shiftati" all'indietro di una word:

CPU-Send ---> CPU-Recv

continuos_increase ---> integer_test_01

integer_test_01 ---> integer_test_02

integer_test_02 ---> integer_test_03

integer_test_03 ---> integer_test_04

integer_test_04 ---> continuos_increase

C'è un motivo valido per tutto ciò?

O c'è qualcosa che sbaglio?

Per i più pazienti aggiungo un'ulteriore domanda: se le due CPU fossero di due progetti differenti, cosa cambierebbe?

Grazie in anticipo

Modificato: da Gapo
Link al commento
Condividi su altri siti


Fico... ora sto provando con due progetti distinti (che poi sarà la situazione reale in cui mi troverò), e lo shift non c'è più... a volte Siemens proprio non la capisco...

Vabbeh, con tutti i benefici del dubbio sul discorso dello shift con le CPU nello stesso progetto (che comunque basta saperlo in anticipo), pare che il problema sia risolto. Se qualcuno ha la stessa necessità e si trova in difficoltà, faccia un fischio.

ciao

Link al commento
Condividi su altri siti

Premetto che non ho mai usato ag_send e ag_receive.

Ho usato invece x_get e x_put.

Sei sicuro che in una cpu devi mettere ag_send e nellaltra ag_receive? Devono per forza essere accoppiate? Non è sufficiente solo una?

Io per scambiare dati preferisco usare solo x_get in entrambe le cpu.

Link al commento
Condividi su altri siti

X_GET e X_PUT, AFAIK, non funzionano per la Ethernet.

In ogni caso, AG_SEND e AG_RECV vanno messe entrambe, anche perché la prima specifica dove prendere i dati, ma non dove metterli, e la seconda il contrario (a differenza di X_GET e X_PUT, dove specifichi entrambe)

Link al commento
Condividi su altri siti

se stai trasmettendo delle stringhe ASCII , vengono sempre aggiunti dal sistema siemens due caratteri ad inizio buffer , li usa lui per cose sue come intestazione del frame .

Quindi non le tocchi , le salti .

Se invece stai traferendo dei bytes di dati "binari" allora guarda bene come te li shifta

Di solito siemens trasmette con bytes invertiti all'interno di una word e word invertite all'interno di una doppia word .

Questo e' dovuto all'architettura del processore e del sistema little endian .

COn un TAW puoi sistemare tutto

Lo uso spesso per mettere a posto gli allarmi in modo tale da poterli copiare in maniera continua dal db del plc a wincc

L mw10

TAW

T MW12

Se invece il tuo problema e' un altro ancora , allora sutidati bene il comportamento e scrivi un po di codice per un algoritmo che ti sistemi il tutto

Link al commento
Condividi su altri siti

Nessuna stringa ASCII e nessuna inversione di Word o Byte... è un vero e proprio shift, ma solo se le due CPU sono nello stesso progetto: infatti lo stesso codice tra due CPU di progetti distinti non produce alcuno shift. Il codice è esattamente quello che ho riportato. Il problema non è scrivere algoritmi per "sistemare" la faccenda, ma capire perché lo fa... comunque al momento ho accantonato il problema, visto che nella situazione reale in cui mi troverò, il problema non sussiste.

L'unica cosa che mi viene in mente, ripensandoci, è che non avevo assegnato a nessuno il ruolo di master, cosa che invece ho dovuto fare con i due progetti distinti, altrimenti non c'era proprio comunicazione

ciao

Link al commento
Condividi su altri siti

In realtà, finche si sta nello stesso progetto, sembrerebbe che non si siano grossi problemi. Sono andato a ripescare anche un vecchio progetto di test dove scambiavo dati tra 5 CPU e tutto funzionava alla perfezione (a parte lo shift).

Con CPU in progetti diversi invece la situazione cambia, e senza master non c'è proprio comunicazione.

In ogni caso è probabile che sia proprio l amancanza di master a generare lo shift nel pruimo caso (solo che ora non ho modo di fare altre prove)

ciao

Link al commento
Condividi su altri siti

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...