Vai al contenuto
PLC Forum


Visual Basic - COMUNICAZIONE SERIALE


MICHELESAMM

Messaggi consigliati

SALVE A TUTTI , SONO NUOVO IN QUESTO CAMPO; POTETE DARMI DEI CONSIGLI SU COME METTERE IN COMUNICAZIONE UN PLC DELLA SIEMENS S5 CON UN PC USANDO IL VISUAL BASIC?.

LA PARTE PLC NON è UN PROBLEMA STO IMPROVVISANDO CON IL VB , NEI DETTAGLI NON SAPREI COME RICEVERE I DATI DAL PLC TRAMITE LA SERIALE. SO CHE ESISTE IL CONTROLLO MSCOMM , MI SERVIREBBE UN PICCOLO ESEMPIO DI PROGRAMMA IN VB IN MODO TALE DA FARMI CAPIRE COME RIPORTARMI UN BYTE SUL PC

GRAZIE

Link al commento
Condividi su altri siti


ciao nelle mia piccola esperienza posso dirti e spero di non sbagliarmi e se mi sbaglio qualcuno mi corregga ma per leggere i dati da un S5 Siemens devi conoscere il protocollo di comunicazione, o comprare delle Dll o OCX

dalla siemens o altre societa' se cerchi nel forum trovi dei link , non e sufficente secondo me il solo MSComm.

Spero di non avere detto qualche stupidata

Link al commento
Condividi su altri siti

Ciao

Io, anni fa, mi ero fatto un protocollino in C che comunicava con la porta di comunicazione della CPU

(utilizzando in protocollo AS511) e funzionava molto bene (ero in ambiente UNIX) ultimamente

ho fatto il porting in visual basic e continua a funzionare (anche se però non è MultiThread :( ).

Quello che ti serve è l'oggetto mscomm, una interfaccia current loop e le specifiche del protocollo...

qui di seguito ti appoggio quello che ti serve per leggere e scrivere le DB, ma mi raccomando stai attento

che se ti sbagli nell'indirizzamento puoi leggere e SCRIVERE qualsiasi cosa anche il programma e poi PARTICOLARE ATTENZIONE ALLA PULIZIA DEI CARATTERI DLE.

In bocca al lupo !!!

SIEMENS SIMATIC S5 AS511 (Programming port) protocol description

------------------------------------------------------------------

Siemens data frame is not usual, open your port with:

speed 9600 baud

data 8 bits

stop 1 bit

parity EVEN

DLE (10hex) is a control character, used to inform the receiver that the

following char is to be considered a control character and not a data byte.

In other words, DLE is a software switch within the AS511 protocol to divide

control and data bytes.

Whenever a DATA byte containing the value 10hex is to be sent, the sender must

DOUBLE the char. This means that to send a data byte 10hex, the sender must

send 10hex 10hex (DLE DLE).

The receiver must consider the thing, so a single DLE will mean a protocol

signal, while two consecutive DLE are to be interpreted as a SINGLE data byte

containing the 10hex value. This is a little tricky, since the receiver NEVER

knows exactly how many bytes to expect.

Take also note that the AG can answer DLE NAK instead of DLE ACK if the

requested operation can not be carried out.

In this case, the PG must abort the communication and wait for 500ms before

attempting a new communication.

The value of 500mS is also applied as timeout value in case of missing response

from the partner.This also means that no "holes" of 500mS (or more) are allowed

during a communication (e.g. within a DB_READ function)

To read or write a datablock value, you need to know its address in PLC memory.

Therefore you must invoke B_INFO function to know the address, then you can

call DB_READ or DB_WRITE by giving the initial and final address of the area to

be read or written.

Be aware that in SIMATIC the LSB/MSB bytes order is reversed:

SIMATIC:

15..............0

BYTE 0 BYTE 1

INTEL:

15..............0

BYTE 1 BYTE 0

To obtain the correct integer value of a dataword, the user

must therefore:

- swap the received bytes

and

- swap the bytes before sending them to the PLC

//////////////////////////////////////////////////////////////////////////////

B_INFO

input: block number

output: initial address of DW0 in AG

PG AS

(hex) (hex)

---------------------- function start --------

02 ----> STX

<---- 10 DLE

<---- 06 ACK

1A ----> B_INFO function code = 1Ah

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 16 AG answer=16h

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

---------------------- header info --------

01 ----> ID=01h for Datablock

XX ----> DB number (0..255)

10 ----> DLE

04 ----> EOT

<---- 10 DLE

<---- 06 ACK

---------------------- data --------

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 00 NUL

<---- XX DB initial address

<---- XX

<---- 70 synchronization code: 70 70

<---- 70

<---- 41 block ID and DB number : 41 XX

<---- XX

<---- XX PG ID code: XX XX

<---- XX

<---- XX library number: XX XX

<---- XX

<---- XX block length (words): XX XX

<---- XX

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

---------------------- terminate --------

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 12 AG "end of transmission" code: 12h

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

//////////////////////////////////////////////////////////////////////////////

DB_READ

input: initial address in AG

final address in AG

output: contents of datawords

PG AS

(hex) (hex)

---------------------- function start --------

02 ----> STX

<---- 10 DLE

<---- 06 ACK

04 ----> DB_READ function code = 04h

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 16 AG answer=16h

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

---------------------- header info --------

XX ----> initial address in AG: XX XX

XX ---->

XX ----> final address in AG: XX XX

XX ---->

10 ----> DLE

04 ----> EOT

<---- 10 DLE

<---- 06 ACK

---------------------- data --------

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 00 NUL

<---- 00 NUL

<---- 00 NUL

<---- 00 NUL

<---- 00 NUL

<---- XX first byte of data

<---- XX

<---- XX

. . .

. . .

<---- XX

<---- XX

<---- XX last byte of data

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

---------------------- terminate --------

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 12 AG "end of transmission" code: 12h

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

//////////////////////////////////////////////////////////////////////////////

DB_WRITE

input: - initial address in AG

- contents of datawords

output: - none

PG AS

(hex) (hex)

---------------------- function start --------

02 ----> STX

<---- 10 DLE

<---- 06 ACK

03 ----> DB_WRITE function code = 03h

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 16 AG answer=16h

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

---------------------- header info --------

XX ----> initial address in AG: XX XX

XX ---->

---------------------- data --------

XX ----> first byte of data

XX ---->

XX ---->

. . .

. . .

XX ---->

XX ---->

XX ----> last byte of data

10 ----> DLE

04 ----> EOT

----> 10 DLE

----> 06 ACK

---------------------- terminate --------

<---- 02 STX

10 ----> DLE

06 ----> ACK

<---- 12 AG "end of transmission" code: 12h

<---- 10 DLE

<---- 03 ETX

10 ----> DLE

06 ----> ACK

Link al commento
Condividi su altri siti

  • 1 year later...

c'e un sito che mette a disposizione una libreria di base IdComm20.dll

e una librerie per ogni PLC ad esempio per s5 è ID_RK512.dll o Idc_PPI per s7200 etc

Queste sono delle demo quindi la comunicazione dura 5min e poi si interrompe

io le ho usate con VB6 funzionano perfettamente e non costano molto

PS:se scarichi la demo ricordati di scaricare IdComm® 2.0 - Utilities c'e il software per l'attivazione delle librerie che naturalmente vanno nella cartella C:\WINDOWS\SYSTEM32

LINK DEL SITO : http://www.sintesi.com/italiano/index.htm

VAI SUL MENU PRODOTTI

POI NEL MENU AUTOMAZIONE A SINISTRA CLICCA SU IDCOMM

Modificato: da antowery
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...