gpt4 book ai didi

c - WinCC C 脚本从字中读取位 - 一般 C 建议

转载 作者:行者123 更新时间:2023-11-30 16:41:18 24 4
gpt4 key购买 nike

我手上有一个巨大的问题,我认为它不能正常运行的原因在于我的 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 屏幕上对象的状态。问题是我没有得到我期望的值...它编译没有问题但是...有人有一些建议吗?如何改进我的代码?

最佳答案

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

您在函数内执行包含操作。这是不好的做法。然后你定义一个 typedef函数内部有编译指示和原型(prototype)。强烈建议在启动函数之前执行此操作,因此:

#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]并在函数末尾返回该数组。但是数组是一个所谓的自动(本地)变量,当函数返回时,它不再存在(它在堆栈上分配,该部分在返回时被释放,并且可以被以下代码覆盖)函数调用)。

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

关于c - WinCC C 脚本从字中读取位 - 一般 C 建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46297173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com