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