Page 1 sur 1
Action en C dans WinCC
Posté : 28 janv. 2016, 07:44
par Damall
Bonjour,
j'ai une photocellule à animer dans WinCC V6.0, qui dans l'automate à l'adresse DB5.DBX665.6
Dans WinCC, pour limiter le nombre de variables, c'est déclaré en mot : AG1DB5DBW664
Pour garder le standard de ceux qui ont développer la supervision j'ai fait un copier/coller d'une photocellule qui fonctionne et j'ai changer le script en C :
#include "apdefap.h"
long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
#define Tag_Lichtschranke "AG1DB5DBW664"
// WINCC:TAGNAME_SECTION_END
// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END
return(L_Status(GetTagWord(Tag_Lichtschranke),14)); // Bit14 et 15
}
ça ne fonctionne pas !
J'ai fait l'essai en utilisant variable dynamique en la variable AG1DB5DBW664 Bit 6 et ça fonctionne.
Je ne comprend pas! j'ai essayé dans changer 14 par 6 mais rien ne change.

Re: Action en C dans WinCC
Posté : 28 janv. 2016, 08:33
par itasoft
slts,
Si c’est DB5.DBW665.6 pourquoi c’est déclarée en AG1DB5DBW664 au lieu de AG1DB5DBW665 ?
Re: Action en C dans WinCC
Posté : 28 janv. 2016, 09:04
par Damall
Salut,
c'est déclarer en tant que WORD.
C'est pour que dans WinCC on n'utilise qu'un seul TAG, plutôt que de déclarer 16 BOOL.
Pour l'achat des licences WinCC mois il y a de variables, mois c'est chers.
@+
Re: Action en C dans WinCC
Posté : 28 janv. 2016, 09:33
par philou77
Salut !
+1 avec itasoft.
un word c'est 16 bits , pas 32 !
Donc ou la déclaration est pas bonne, ou bien il faut aller voir le 21ème bit de ton mot !
attention avec l'ordre poids faible et poids fort pour un mot de 32 bit !
Re: Action en C dans WinCC
Posté : 28 janv. 2016, 09:50
par Damall
Erreur de ma part,
adresse DB5.DBX665.6
Re: Action en C dans WinCC
Posté : 28 janv. 2016, 13:51
par steph68
hello
Si c’est DB5.DBW665.6 pourquoi c’est déclarée en AG1DB5DBW664 au lieu de AG1DB5DBW665
parce que ce n'est pas schneider.
l'adressage mémoire est différent
DBW664 = 2 octets = DBB664 et DBB665
DBD664 = 2 mots = DBW664 et DBW666
et sans la fonction "L_Status", arrives-tu à avoir la valeur du mot en entier (les 16 bits) ?
quelle est la fonction de "L_Status" (c'est quoi la signature / le prototype de cette fonction) ?
ça sent une valeur retour de type "char" qui est convertie vers un "long" (donc on ne garde que les 8 bits de poids faible)...
@+
Re: Action en C dans WinCC
Posté : 28 janv. 2016, 14:48
par itasoft
Slts,
Je récapitule, les cellules sont dans des bits de mots, sur le WinCC on déclare des mots pour économiser la mémoire, donc si je comprends bien la fonction en C c’est juste pour faire un masque afin d’extraite le bit ?
Il faut avoir tué son père et sa mère pour faire du Siemens,
LOL
Re: Action en C dans WinCC
Posté : 28 janv. 2016, 16:21
par steph68
pas pour économiser de la mémoire mais pour économiser des tags (un mnémonique déclaré) donc de l'argent (en fonction de la quantité requise, le prix de la licence change - par tranches de tags)
utiliser des bits de mot c'est une bonne pratique, peu importe la cible (schneider ou siemens ...)
c'est juste qu'il ne déclare qu'un seul tag pour le mot entier et pas 16 tags (un pour chaque bits du mot)
donc si je comprends bien la fonction en C c’est juste pour faire un masque afin d’extraite le bit
j'en sais rien, je suppose comme toi (c'est du copier-coller d'un autre script) et c'est là qu'est surement l'erreur...
j'ai pas encore de boule de crystal (mais ça va venir

)
la définition est dans le fichier "apdefap.h", surement une fonction inline (ou au pire une macro)
@+
Re: Action en C dans WinCC
Posté : 28 janv. 2016, 23:54
par kosbor
C'est quand meme pas sorcier wincc c'est standard à 100%
pour ce probleme il y a 10 facons differentes de resoudre le probleme si on veut faire du c ok , mais c'est la facon la plus compliqué,
alors qu'il existe des dialogues dynamique super simple avec choix de bit masqué

......
on peut ajouter dans la vue où on veut dynamiser l'objet, une fenetre d'application dispo dans le designer (gsc diag un genre de console debug) et faire un printf
L_Status est une fonction de projet crée maison, elle est dispo dans Cscript treenode "fonctions de projet"
Code : Tout sélectionner
#include "apdefap.h"
long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
#define Tag_Lichtschranke "AG1DB5DBW664"
printf("Tag_Lichtschranke---> %d ; L_Status(GetTagWord(Tag_Lichtschranke),14)---> %d \r\n", GetTagWord(Tag_Lichtschranke) ,L_Status(GetTagWord(Tag_Lichtschranke),14));
return(L_Status(GetTagWord(Tag_Lichtschranke),14)); // Bit14 et 15
}
ps: point trés important pour les operations sur masque maison toujours surveiller qu'on est pas >au bit 31 sinon overflow
et pourquoi ne pas utiliser le vbs c'est quand meme beaucoup plus simple et on garde surtout les references croisées contrairement au c
Re: Action en C dans WinCC
Posté : 03 févr. 2016, 09:19
par Damall
itasoft a écrit :Slts,
Il faut avoir tué son père et sa mère pour faire du Siemens,
LOL
Si tu savais tout ce que les allemand sont capable de faire pour rendre un programme le plus compliquer possible. Je me demande s'ils ne le font pas exprès pour qu'on les rappel pour faire des modifs.
Pour en revenir à mon problème, je crois que je vais pas chercher plus longtemps, je vais passer en dialogue dynamique.