首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinCC c++脚本从word - general C建议中读取位

WinCC c++脚本从word - general C建议中读取位
EN

Stack Overflow用户
提问于 2017-09-19 09:47:21
回答 1查看 3.2K关注 0票数 0

我有一个巨大的问题,我认为它不能正常运作的原因是我的C语言知识,也就是说,让我们面对它,最好是新手。

代码语言:javascript
复制
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)收集一个字类型数据(16位),我需要从所述单词中读取比特,以确定WinCC中屏幕上对象的状态。问题是我没有得到我期望的价值..。它编译没有问题但是..。有人有什么建议吗?如何改进我的代码?

EN

回答 1

Stack Overflow用户

发布于 2017-09-19 10:35:20

哦,天哪,关于代码改进和可能解决你的问题的一些评论:

在函数中执行包含操作。那是糟糕的做法。然后,在函数中定义一个typedef,并具有语用和原型。强烈建议在启动函数之前执行此操作,因此:

代码语言:javascript
复制
#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开始,所以只需从0开始:for (i=0; i<NumCNS; i++),但是,您所做的事情并没有错。

但是你的GetBitsFromWord确实有问题。在这个函数中,您声明一个数组int bits[16],在函数的末尾返回这个数组。但是aray是一个所谓的自动(局部变量)变量,当函数返回时就不再存在了(它在堆栈上分配,该部分在返回时释放,并可能被以下函数调用覆盖)。

相反,将其声明为void GetBitsFromWord(WORD _word, int bits[16]),并将位数组作为参数从调用方传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46297173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档