2017-09-19 826 views
0

我手上有一個很大的問題,我認爲它的原因不能正常工作在我的C語言知識中,讓我們面對它最好的新手。 ..WinCC c腳本讀取字的位 - 一般C的建議

void * KT_Indirect_CNS(int NumCNS, char *CNSDescr[], char *CNSTag[], int *CNSIsBit[], char* lpszPictureName){ 

#include "apdefap.h" 

char TagNameEnable[255], 
    TagNameTrue[255], 
    TagNameFalse[255], 
    TagNameString[255], 
    TagNameCNS[255], 
    TagNameCNSString[255], 
    TagNameTemp[255]; 

int i, 
     count; 

typedef struct 
{ 
    LONG x; 
    LONG y; 
} tPOINT; 

#pragma code ("user32.dll"); 
BOOL GetCursorPos(tPOINT* lpPoint); 
#pragma code(); 

tPOINT pt; 

GetCursorPos(&pt); 

for (i=1; i<=NumCNS; i++) 
{ 
    sprintf(TagNameEnable, "CNS%d.Enabled", i); 
    SetTagBit(TagNameEnable, 1); 

    sprintf(TagNameCNS, CNSTag[i-1]); 
    sprintf(TagNameTrue, "CNS%d.True", i); 
    sprintf(TagNameFalse, "CNS%d.False", i); 
    if (CNSIsBit[i-1] == 17) 
    { 
       BOOL temp = GetTagBit(TagNameCNS); 
     if (temp==1) 
     { 
      SetTagBit(TagNameTrue, 1); 
      SetTagBit(TagNameFalse, 0); 
        count++; 
     } 
     else 
     { 
      SetTagBit(TagNameTrue, 0); 
      SetTagBit(TagNameFalse, 1); 
     } 
    } 
    if ((CNSIsBit[i-1] >= 0) && (CNSIsBit[i-1] <=16)) 
    { 
     int *bits = GetBitsFromWord(GetTagWord(TagNameCNS)); 
     int index = (int)CNSIsBit[i-1]; 
     if (bits[index]==1) 
     { 
      SetTagBit(TagNameTrue, 1); 
      SetTagBit(TagNameFalse, 0); 
        count++; 
     } 
     if (bits[index]==0) 
     { 
      SetTagBit(TagNameTrue, 0); 
      SetTagBit(TagNameFalse, 1); 
     } 
    } 
    sprintf(TagNameString, "CNS%d.String", i); 
    SetTagChar(TagNameString, CNSDescr[i-1]); 
} 

if (NumCNS <16) 
{ 
    for (i=NumCNS+1; i<=16; i++) 
    { 
     sprintf(TagNameTrue, "CNS%d.True", i); 
     sprintf(TagNameFalse, "CNS%d.False", i); 
     sprintf(TagNameEnable, "CNS%d.Enabled", i); 
     SetTagBit(TagNameTrue, 0); 
     SetTagBit(TagNameFalse, 0); 
     SetTagBit(TagNameEnable, 0); 
    } 
} 

if (count != NumCNS) 
{ 
    sprintf(TagNameTemp, "CNS_Page_AllGood"); 
    SetTagBit(TagNameTemp, 0); 
     SetVisible(lpszPictureName,"KT_CNS",TRUE); 
    sprintf(TagNameTemp, "CNS_PAGE_MOUSE_X"); 
    SetTagSWord(TagNameTemp, pt.x-5); 
    sprintf(TagNameTemp, "CNS_PAGE_MOUSE_Y"); 
    SetTagSWord(TagNameTemp, pt.y-150); 
    sprintf(TagNameTemp, "CNS_PAGE_HEIGHT"); 
    SetTagSWord(TagNameTemp, 30*NumCNS); 
} 
if (count == NumCNS) 
{ 
    sprintf(TagNameTemp, "CNS_Page_AllGood"); 
    SetTagBit(TagNameTemp, 1); 
} 

return ("Controller Initilized");} 


int *GetBitsFromWord(WORD _word){ 

int bits[16]; 

bits[0] = (_word & 0x0001)?1:0; 
bits[1] = (_word & 0x0002)?1:0; 
bits[2] = (_word & 0x0004)?1:0; 
bits[3] = (_word & 0x0008)?1:0; 
bits[4] = (_word & 0x0010)?1:0; 
bits[5] = (_word & 0x0020)?1:0; 
bits[6] = (_word & 0x0040)?1:0; 
bits[7] = (_word & 0x0080)?1:0; 
bits[8] = (_word & 0x0100)?1:0; 
bits[9] = (_word & 0x0200)?1:0; 
bits[10] = (_word & 0x0400)?1:0; 
bits[11] = (_word & 0x0800)?1:0; 
bits[12] = (_word & 0x1000)?1:0; 
bits[13] = (_word & 0x2000)?1:0; 
bits[14] = (_word & 0x4000)?1:0; 
bits[15] = (_word & 0x8000)?1:0; 

return bits;} 

這些都是我用它來收集一般植物不能運行設備的原因腳本......我認爲,當我測試了它的工作,愚蠢的我想補充... 我認爲,我的指針使用知識足夠低,犯了一個錯誤,會讓我死亡,我想... 本質上,我需要從我的PLC(s7-400)收集WORD類型數據(16位),並且需要簧片從所述單詞中確定位WinCC中屏幕上的對象狀態。 事情是我沒有得到我期望的值...它編譯沒有問題,但... 有人有一些建議?我如何改進我的代碼?

回答

0

哦,孩子,頗有些言論對代碼的改進和可能解決您的問題:

你一個包括函數中。這是不好的做法。然後你在函數內部定義一個typedef並且有編譯指示和一個原型。我們強烈建議要做到這一點,你開始一個功能之前,所以:

#include "apdefap.h" 

typedef struct 
{ 
    LONG x; 
    LONG y; 
} tPOINT; 

#pragma code ("user32.dll"); 
BOOL GetCursorPos(tPOINT* lpPoint); 
#pragma code(); 

void * KT_Indirect_CNS(int NumCNS, char *CNSDescr[], char *CNSTag[], int *CNSIsBit[], char* lpszPictureName) 
{ 
    char TagNameEnable[255], 
     TagNameTrue[255], 
     TagNameFalse[255], 
     TagNameString[255], 
     TagNameCNS[255], 
     TagNameCNSString[255], 
     TagNameTemp[255]; 

    int i, count; 
    //... 
} 

在你的循環for (i=1; i<=NumCNS; i++)你從1開始在C語言中的所有索引從0開始。在我看不到其餘的代碼令人信服的理由從1開始,所以從零開始:for (i=0; i<NumCNS; i++),但是,您所做的並不是錯誤。

但是你的GetBitsFromWord真的有問題。在這個函數內部,你聲明一個數組int bits[16],並在函數結束時返回這個數組。但是,aray是一個所謂的自動(本地)變量,當函數返回時它不再存在(它在堆棧上分配,並且該部件在返回時釋放並可能被以下函數調用覆蓋)。

取而代之,聲明它爲void GetBitsFromWord(WORD _word, int bits[16])並傳遞位數組作爲調用者的參數。