Vai al contenuto
PLC Forum


Trasformazione Word To Bit Script C Wincc 6.0


boru

Messaggi consigliati

Salve a tutti!

Ho un "banale" problema con uno script C in wincc 6.0

utilizzo tale script per impostare e caricare dei valori su una pagina parametrizzata.

per i valori analogici e digitali non ho alcun problema e uso indirizzamenti sugli oggetti della pagina con la funzione LinkName

Dovrei però trasformare ed ottenere da una tag Word o Dword i singoli valori in bit e non riesco a venirne a capo........ la domanda sarà banale ma che formula devo utilizare?

grazie mille in anticipo a chi riuscirà ad aiutarmi!

Link al commento
Condividi su altri siti


premetto che non l'ho mai utilizzato con wincc ma con altri scada o terminali operatore che supportano gli script funziona.

allego codice

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

scomposizione word xxx in bit

bit0=word xxx & 0x0001

bit1=word xxx & 0x0002

bit2=word xxx & 0x0004

bit3=word xxx & 0x0008

bit4=word xxx & 0x0010

bit5=word xxx & 0x0020

bit6=word xxx & 0x0040

bit7=word xxx & 0x0080

bit8=word xxx & 0x0100

bit9=word xxx & 0x0200

bit10=word xxx & 0x0400

bit11=word xxx & 0x0800

bit12=word xxx & 0x1000

bit13=word xxx & 0x2000

bit14=word xxx & 0x4000

bit15=word xxx & 0x8000

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

prova e fai sapere come e' andata!

bye

Link al commento
Condividi su altri siti

Innanzi tutto grazie mille per la velocità della risposta!

Continuo però ad avere il problema..... lo script è cosi riassunto:

Puntualizzo che lo script lo faccio girare solo quando intendo caricare la pagina di popup tramite l'associazione con un "ID" e al suo interno con l'istr. CASE carico i vari valori

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

WORD word;

LINKINFO test;

test.LinkType = 1;

test.dwCycle = 0;

BOOL bit0,bit1,bit2;

word=GetTagWordWait("ANALOG"); //"ANALOG" variabile esterna da plc

bit0= word & 0x0001;

bit1= word & 0x0002;

bit2= word & 0x0004;

strcpy(test.szLinkName,bit0); //type mismatch in argument 2

SetLink("ZZZ_POPUP_MOTORE","TEST","Visible",&test); //ZZZ_POPUP_MOTORE pagina grafica

//TEST oggetto da rendere visibile

//ZZZ_POPUP_MOTORE pagina grafica

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

il mio problema è che lo script non accetta nello <strcpy> il valore calcolato in bit0 //type mismatch in argument 2

l'operazione viene eseguita correttamente, infatti se la invio ad un bit del plc funziona correttamente.

SetTagBit("BIT_1",bit0); //imposta il tag "BIT_1" a 1 con il primo bit della variabile "ANALOG"

Non so + veramente come fare.......

avendo molta + esperienza su intouch della Wonderware ho sempre eseguito script del genere dichiarando le variabili

della pagina di popup come indirect e poi nello script basta mettere tag1=tag2; dove tag1 è indirect e tag2 è la variabile del plc

Ma è possibile che un prodotto super potente come wincc queste semplici operazioni non sono fattibili?

Non esistono proprio delle tag indirette?

Link al commento
Condividi su altri siti

ripeto ... non so come lavora wincc ma

forse non riconosce il suffisso 0x come identificativo di esadecimale?

hai provato

bit15=word xxx & 0x8000 'hex

e' come scrivere

bit15=word xxx & 32768 'dec

e' come scrivere

bit15=word xxx & 100000000000000 'bin

di piu non so

bye

Link al commento
Condividi su altri siti

grazie mile......

il suffisso lo riconosce, infatti l'operazione di maschera della word la effettua correttamente, quello che hai scritto è giusto.......

il mio problema è che non viene accettato il valore bit0 dallo <STRCPY> e quindi non riesco ad abbinare il risultato di maschera ad un oggetto sulla pagina che carico.

Mi Sembra veramente impossibile ma......... sul forum ho letto diversi post riguardo a pagine di pop up ma niente che faccia al caso mio.

Ciao

Link al commento
Condividi su altri siti

Scusa boru, forse non ho ben capito il tuo obbiettivo, ma io uso regolarmente script in c per attivare/disattivare oggetti

sul video in funzione di una word che arriva dal plc.

Scompongo vado al leggere la word faccio l'and con una maschera,e se il risultato è vero l'oggetto appare.

Non ho capito lo scopo del strcopy.

Cerca di essere più chiaro, magari ti posso aiutare

ciao

Link al commento
Condividi su altri siti

ciao fabio,

uso lo strcpy in quanto utilizzo la funzione SetLink per andare a modificare le proprietà degli oggetti in una pagina.

se ho una tag del plc di tipo int,float,byte o bit non ho nessun problema a visualizzare e modificare gli oggetti della pagina di popup.....

ll problema che ho per la mia applicazione è che avendo una variabile unsigned integer (da PLC) dovrei poterla scomporre in bit per una visualizzazione particolare dopo averla caricata sulla pagina desiderata.

ti faccio un esempio, nella word che passo alla pagina di popup (nel mio caso utilizzo il set link ma è la stessa cosa se utilizzo una variabile di appoggio di tipo string per visualizzare un tag indiretto) devo poter visualizzare 16 scritte a seconda se il bit di tale word è a 0 oppure a 1.

se utilizzo direttamente il tag nella pagina non ho problemi ovviamente ma se la tag la carico da uno script non si riesce in alcun modo.

spero di esser stato + chiaro, grazie mille per l'interessamento.

saluti e buon inizio settimana.

Link al commento
Condividi su altri siti

ifachsoftware

Non conosco WINCC ma uso il C da piu' di 20 anni

usi l'istruzione STRCPY per accodare il tuo risultato ad una stringa e naturalmente di da' errore

prova con

sprintf(test.szLinkName,"%d",word & 0x0001 ? 1 : 0);

Ciao :)

Link al commento
Condividi su altri siti

Inserita: (modificato)

Grazie mille a tutti!!!!!

problema risolto con un'azione ciclica sulla pagina di popup, anche se non è consigliato da Siemens in altro modo non sapevo proprio come fare!!!!!!

Mi è stato molto utile un esempio su sito della Siemens:

http://support.automation.siemens.com/WW/view/it/14278452

Utilizzo lo strcpy in quanto devo caricare un valore utilizzando SetLink.

Sulla mia pagina di popup analizzo la Word settata nello script di lancio con il comando GetLinkedVariable come descritto dalla knowledgebase della siemens.

Se interessa a qualcuno lo script di lancio è:

void POPUP_MOTORI_01_20()

{

//dichiarazione variabili per comando apertura pagina

char* lpszPictureName;

char* lpszObjectName;

char* lpszPropertyName;

//dichiarazione variabili per link agli oggetti presenti sulla pagina

LINKINFO numero_allarme;

WORD Numero_Mot,Numero_allarme;

BOOL att_page;

// impostazioni per le variabili link che sono precedentemente state dichiarate

numero_allarme.LinkType = 1;

numero_allarme.dwCycle = 0;

Numero_Mot=GetTagWordWait("NUM_MOT");//lettura dell'ID del motore da caricare

switch (Numero_Mot)

{

case 1 :

#define ALLARME "ALM_MOT1" //word di allarmi motore

strcpy(numero_allarme.szLinkName,ALLARME); //

PDLRTSetPropEx(0,lpszPictureName,"ZZZ_POPUP_MOTORE","Visible",VT_BOOL,&att_page,NULL,NULL,0,NULL,NULL);

break;

case 2 :

//inseriti 20 case per motori impianto

break;

SetLink("ZZZ_POPUP_MOTORE","NUM_ALLARME","Text",&numero_allarme);

printf ("ESEGUITA LA GENERAZIONE DI EVENTUALI ERRORI AL TERMINE DELLO SCRIPT MOTORI"); // xxxxxx

}

nella pagina di popup è eseguito il seguente script:

#include "apdefap.h"

BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

char* pszVarName = NULL;

char szVarName[40+1];

WORD word;

BOOL bit0,bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8,bit9,bit10,bit11,bit12,bit13,bit14,

it15;

//Lettura del nome di variabile di una connessione diretta

//

pszVarName =GetLinkedVariable("ZZZ_POPUP_MOTORE.PDL","NUM_ALLARME","Text"); //

SetTagBit("CAMPO_ALL_1",0);// azzeramento bit di visualizzazione

SetTagBit("CAMPO_ALL_2",0);

SetTagBit("CAMPO_ALL_3",0);

SetTagBit("CAMPO_ALL_4",0);

SetTagBit("CAMPO_ALL_5",0);

SetTagBit("CAMPO_ALL_6",0);

if (strlen(pszVarName) <= 0)

{

printf("Errore: La proprietà non è collegata con una variabile di WinCC !\r\n");

}

else if (strlen(pszVarName) >= sizeof (szVarName))

{

printf("Errore: La variabile C occupa troppo poco spazio per poter accettare l'intero nome della variabile \r\n");

}

else{

word=GetTagWord(pszVarName); //Return-Type: WORD riceve il valore del link name caricato dallo script

//============================================

bit0=word & 0x0001;

bit1=word & 0x0002;

bit2=word & 0x0004;

bit3=word & 0x0008;

bit4=word & 0x0010;

bit5=word & 0x0020;

bit6=word & 0x0040;

bit7=word & 0x0080;

bit8=word & 0x0100;

bit9=word & 0x0200;

bit10=word & 0x0400;

bit11=word & 0x0800;

bit12=word & 0x1000;

bit13=word & 0x2000;

bit14=word & 0x4000;

bit15=word & 0x8000;

if (bit8) // utilizzato bit 8 perchè i byte sono invertiti

{

SetTagBit("CAMPO_ALL_1",1);// CAMPO_ALL_1 binary tag per visualizzazione 1° allarme attivo sulla pagina di popup

//printf("BIT 0 SETTATO A 1 WORD =1 !\r\n");

}

if (bit9)

{

SetTagBit("CAMPO_ALL_2",1);

}

if (bit10)

{

SetTagBit("CAMPO_ALL_3",1);

}

if (bit11)

{

SetTagBit("CAMPO_ALL_4",1);

}

if (bit12)

{

SetTagBit("CAMPO_ALL_5",1);

}

if (bit13)

{

SetTagBit("CAMPO_ALL_6",1);

}

//============================================

return 1;

}

}

SPERO POSSA ESSERE DI AIUTO A QUALCHE ALTRO DISPERATO COME ME!!!!

Ciao a tutti :lol::);):lol::)

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