Non capisco bene la domanda, cerco di interpretarla. Immagino che tu debba con un comando di read da protocollo Hostlink, restituire il valore di variabili in memoria PLC.
A questo scopo dovrai allocare le variabili nella memoria del PLC ad indirizzi noti, per uniformarsi al protocollo Modbus nativo di SlimLine, potremo dire che da protocollo HostLink andiamo a leggere variabili allocate in DB 100, magari interponendo un offset sull’indirizzamento. Per quanto riguarda la conversione del valore indirizzo e numero di variabili dalla stringa ricevuta in variabili nel formato esadecimale, consiglio questi semplici statements.
Address:=TO_UINT(RxString[5]-16#30)*4096; (* Variable address *)
Address:=Address+TO_UINT(RxString[6]-16#30)*256; (* Variable address *)
Address:=Address+TO_UINT(RxString[7]-16#30)*16; (* Variable address *)
Address:=Address+TO_UINT(RxString[8]-16#30); (* Variable address *)
NrOfVars:=TO_UINT(RxString[9]-16#30)*4096; (* Numero variabili da leggere *)
NrOfVars:=NrOfVars+TO_UINT(RxString[10]-16#30)*256; (* Numero variabili da leggere *)
NrOfVars:=NrOfVars+TO_UINT(RxString[11]-16#30)*16; (* Numero variabili da leggere *)
NrOfVars:=NrOfVars+TO_UINT(RxString[12]-16#30); (* Numero variabili da leggere *)
Per ottenere il valore in decimale, dovrai moltiplicare per 1000, 100, 10 al posto di 4096, 256, 16.
Per inviare su seriale i dati letti dalla memoria consiglio questi statements:
Ptr:=ADR(%MX100.0)+Address; (* Pointer *)
FOR i:=0 TO TO_INT(NrOfVars) DO
Ch:=Sysfputc(TO_INT(@Ptr), Fp); (* Character *)
Ptr:=Ptr+1; (* Pointer *)
END_FOR;
Allego un programma di esempio per il download.