PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Pointeur en paramètre de sortie d'une fonction
Pointeur en paramètre de sortie d'une fonction
Débuté par Beuchet, 26 oct. 2016 11:45 - 8 réponses
Membre enregistré
5 messages
Posté le 26 octobre 2016 - 11:45
Bonjour,

Dans le cadre de mon projet, je dois lire des données dans un automate Siemens. Pour cela j'utilise la dll Snap7.net dans sa version 1.4.1.

J'ai réussi a me connecter a l'automate sans problème mais pour lire les données, la fonction de snap7 (codée en C) utilise un pointeur sur l'adresse du répertoir de sortie.
Le problème est que je n'arrive pas à récupérer ces données ...

J'ai éssayé d'utiliser les fonctions trasfert(...), ChaîneRécupère(...), d'utiliser une structure comme indiqué dans les docs des fonctions API et AppelDLL32 mais rien y fait, je récupère toujours une chaîne vide !

est ce que quelqu'un est déjà parvenu à faire quelque chose de similaire ? si oui comment ?

Merci de votre aide

Corentin
Posté le 26 octobre 2016 - 12:07
Bonjour,

est ce que quelqu'un est déjà parvenu à faire quelque chose de similaire
? si oui comment ?


Ben oui.. En codant de la bonne manière...

Maintenant, sans voir ni ton code ni les infos sur l'appel en C, ca va
être dur de t'aider plus

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com


Merci de votre aide

Corentin
Membre enregistré
5 messages
Posté le 26 octobre 2016 - 15:26
La fonction en C est :

int TS7Client::ReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData)

Et Voici mon code pour lire dans l'automate :

[
RSTRUCT est une structure
C est une chaîne fixe sur 32
FIN
RS est une RSTRUCT dynamique

N is int = nNbPoints
PtrTableauStruct is entier sans signe sur 4
Temp is array dynamique de RSTRUCT

nState is int = API("Snap7.net","clientSiemens.ReadArea",0x84,databloc,nStartAddress,nNbPoints,nNbBits,&PtrTableauStruct)
Temp = allouer tableau de N RSTRUCT
Transfert(&Temp,&PtrTableauStruct,N*Dimension(RS))


NbPoints étant le nombre de variables à lire dans l'automate
nNbBits est la longueure du mot à lire
0x84, databloc et nStartAddress permettent d'acceder à la bonne zone memoire
tous les bits devraient être à 1 mais je récupère une liste de 0.

Cordialement,
Corentin
Posté le 26 octobre 2016 - 16:19
Rebonjour,


Le 10/26/2016 à 7:26 AM, Beuchet a écrit :
La fonction en C est :

int TS7Client::ReadArea(int Area, int DBNumber, int Start, int Amount,
int WordLen, void *pUsrData)


C'est quoi pUsrdata ?

Et Voici mon code pour lire dans l'automate :

[
RSTRUCT est une Structure
C est une chaîne fixe sur 32
FIN
RS est une RSTRUCT dynamique

N is int = nNbPoints
PtrTableauStruct is entier sans signe sur 4
Temp is array dynamique de RSTRUCT

nState is int =
API("Snap7.net","clientSiemens.ReadArea",0x84,databloc,nStartAddress,nNbPoints,nNbBits,&PtrTableauStruct)

Temp = allouer tableau de N RSTRUCT
Transfert(&Temp,&PtrTableauStruct,N*Dimension(RS))


NbPoints étant le nombre de variables à lire dans l'automate
nNbBits est la longueure du mot à lire
0x84, databloc et nStartAddress permettent d'acceder à la bonne zone
memoire tous les bits devraient être à 1 mais je récupère une liste de 0.

Cordialement, Corentin
Posté le 26 octobre 2016 - 16:34
Pour tester tu peux faire qq chose dans le genre

bufTemp est buffer sur 1024

API("Snap7.net","clientSiemens.ReadArea",0x84,databloc,nStartAddress,nNbPoints,nNbBits,&bufTemp)

et aller voir avec le debugueur si bufTemp contient qq chose
si ça ne contient rien tu peux aussi voir la valeur retournée par la
fonction ReadArea

toi tu donnes
&PtrTableauStruct comme parametre à ReadArea sauf que tu as déclaré ceci
: PtrTableauStruct is entier sans signe sur 4

donc en gros ReadArea a 4 octets pour te retourner une valeur


et tu donnes quoi comme valeur à nStartAddress, nNbPoints, nNbBits ?

eric l.

> Le 26/10/2016 à 13:26, Beuchet a écrit :
La fonction en C est :

int TS7Client::ReadArea(int Area, int DBNumber, int Start, int Amount,
int WordLen, void *pUsrData)

Et Voici mon code pour lire dans l'automate :

[
RSTRUCT est une Structure
C est une chaîne fixe sur 32
FIN
RS est une RSTRUCT dynamique

N is int = nNbPoints
PtrTableauStruct is entier sans signe sur 4
Temp is array dynamique de RSTRUCT

nState is int =
API("Snap7.net","clientSiemens.ReadArea",0x84,databloc,nStartAddress,nNbPoints,nNbBits,&PtrTableauStruct)

Temp = allouer tableau de N RSTRUCT
Transfert(&Temp,&PtrTableauStruct,N*Dimension(RS))


NbPoints étant le nombre de variables à lire dans l'automate
nNbBits est la longueure du mot à lire
0x84, databloc et nStartAddress permettent d'acceder à la bonne zone
memoire tous les bits devraient être à 1 mais je récupère une liste de 0.

Cordialement, Corentin
Membre enregistré
5 messages
Posté le 26 octobre 2016 - 16:42
le buffer dans lequel sont écris les données de l'automate d'après ce que j'ai compris



Membre enregistré
5 messages
Posté le 26 octobre 2016 - 16:54
eric l.

quand je crée un buffer j'obtiens la même chose, une liste de zéros.

quand aux paramètres
DB = 1
Startaddress = 0
NbPoints = 1
NbBits = S7Client.S7WLDWord (=4 ce qui correspond à un mot de 32 bits)
Message modifié, 26 octobre 2016 - 16:54
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 26 octobre 2016 - 17:10
hello,
il y a une chose que je ne comprends pas snap7.net.dll a l'air d'être un assemblage dotnet et tu l'attaques comme une Api Dll . Quelle taille fait cette dll. Chez moi l'assemblage snap7.net.dll fait dans les 40k et l'api DLL snap7.dll fait 217K

--
Ami calmant, J.P
Membre enregistré
5 messages
Posté le 26 octobre 2016 - 17:35
l'assemblage fait bien 40k