1

Тема: Чому не працює макрос, щось зі стилістикою

int MacroEntry()
{
unsigned short buf1[4], buf2[2], buf3[1];
ReadLocal("RW", 210, 3, (void*)&buf1[0], 0);
ReadLocal("RW", 211, 3, (void*)&buf1[1], 0);
ReadLocal("RW", 212, 3, (void*)&buf1[2], 0);
ReadLocal("RW", 213, 3, (void*)&buf1[3], 0);
ReadLocal("LW", 9012, 3, (void*)&buf2[0], 0);
ReadLocal("LW", 9011, 3, (void*)&buf2[1], 0);
WriteLocal("LB", 0, 1, (void*)&buf3[0], 0);

if (((buf2[0]>= buf1[0] && buf2[1]>= buf1[1])||(buf2[0]> buf1[0])) && (((buf2[0]<= buf1[2] && buf2[1]<= buf1[3]))||(buf2[0]<buf1[2])))
buf3[0]=1;
else buf3[0]=0;


/*
заданы массивы buf1[4] - заданий час вкл-викл. часи, хвилини, buf2[2] - час системний, buf3[1] - маркер день-ніч
*/
    return 0;
}

2

Re: Чому не працює макрос, щось зі стилістикою

А що це за мова?
І що означає "не працює"? Описуйте проблему конкретно, бо з вашого опису не дуже зрозуміло, чи вмикали ви комп'ютер. Що саме відбувається?
Основна проблема зі стилістикою, яку я бачу - мова окупанта.

3

Re: Чому не працює макрос, щось зі стилістикою

/*
    Read,Write Local address function:
      int ReadLocal( const char *type, int addr, int nRegs, void *buf, int flag  );
    int WriteLocal( const char *type, int addr, int nRegs, void *buf , int flag );

    Parameter:     type     is the string of "LW","LB" etc;
                                address is the Operation address ;
                                 nRegs    is the length of read or write ;
                                buf        is the buffer which store the reading or writing data;
                                 flag       is 0,then codetype is BIN,is 1  then codetype is BCD;
    return value : 1  ,Operation success
                                 0,  Operation fail.

     eg: read the value of local lw200 and write it to the lw202,with the codetype BIN,
        The code is :

        short buf[2] = {0};
        ReadLocal("LW", 200, 2, (void*)buf, 0);
        WriteLocal("LW", 202, 2, (void*)buf, 0);
*/
int MacroEntry()
{
unsigned short buf1[4], buf2[2], buf3[1];
ReadLocal("RW", 210, 1, (void*)&buf1[0], 0);
ReadLocal("RW", 211, 1, (void*)&buf1[1], 0);
ReadLocal("RW", 212, 1, (void*)&buf1[2], 0);
ReadLocal("RW", 213, 1, (void*)&buf1[3], 0);
ReadLocal("LW", 10002, 1, (void*)&buf2[0], 1);
ReadLocal("LW", 10001, 1, (void*)&buf2[1], 1);
WriteLocal("LW", 250, 1, (void*)&buf3[0], 0);

if (buf2[0]> buf1[0]&&buf2[0]< buf1[2])
buf3[1]=1;
else buf3[1]=0;


/*
задани массиви buf1[4] - заданий час вкл-викл. часи, хвилини, buf2[2] - час системний, buf3[1] - маркер день-ніч
*/
    return 0;
}

Проблема. Згідно встановленого розкладом часу система повинна переходити в денний або нічний час. Часи та хвилини включення денного режиму регістри RW210 RW211, виключення - RW212 RW213. Вони зчитуються в buf1 всі 4 значення. довжина слова 1 код BIN. В макросі ці значення порівнюються зі значеннями системного годинника сенсорної панелі Kinco з buf2 (регістри LW10002 LW10001 - 1 слово BCD) значення 0 або 1 записуються в регістр LW250 buf3, а потім виводиться на екран панелі. Це помісь С++ та китайськи розробки, але в макросі використовуються операнди С++. Дякую. І за мову окупанта також.

4

Re: Чому не працює макрос, щось зі стилістикою

Я гадки не маю, що це все, але логіка каже, що треба спершу виставити значення buf3[1], а потім його записати (WriteLocal), інакше значення буде втрачене.

5

Re: Чому не працює макрос, щось зі стилістикою

Потрібно записувати тоді коли проведено обчислення? тобто так?

nt MacroEntry()
{
unsigned short buf1[4], buf2[2], buf3[1];
ReadLocal("RW", 210, 1, (void*)&buf1[0], 0);
ReadLocal("RW", 211, 1, (void*)&buf1[1], 0);
ReadLocal("RW", 212, 1, (void*)&buf1[2], 0);
ReadLocal("RW", 213, 1, (void*)&buf1[3], 0);
ReadLocal("LW", 10002, 1, (void*)&buf2[0], 1);
ReadLocal("LW", 10001, 1, (void*)&buf2[1], 1);


if (buf2[0]> buf1[0]&&buf2[0]< buf1[2])
buf3[1]=1;
else buf3[1]=0;
WriteLocal("LW", 250, 1, (void*)&buf3[0], 0);

6

Re: Чому не працює макрос, щось зі стилістикою

Не помогло. Щось інше.

7

Re: Чому не працює макрос, щось зі стилістикою

Знову ж таки, чисто припущення, я з цим не працював - змінювати треба buf3[0], а не buf3[1]. Хоча б тому, що buf3[1] не існує, довжина buf3[1] - 1 елемент, максимальний індекс - 0.

8

Re: Чому не працює макрос, щось зі стилістикою

int MacroEntry()
{
     unsigned short buf1[1], buf2[1], buf3 [1], buf4[1], buf5[1], buf6[1], buf7[1];
     ReadLocal("RW210",210,1,(void*)&buf1[0], 0);
     ReadLocal("RW211",211,1,(void*)&buf2[0], 0);
     ReadLocal("RW212",212,1,(void*)&buf3[0], 0);
     ReadLocal("RW213",213,1,(void*)&buf4[0], 0);
     ReadLocal("LW10002",10002,1,(void*)&buf5[0], 0);
     ReadLocal("LW10001",10001,1,(void*)&buf6[0], 0);

   if(((LW10002>=RW210)&&(LW10001>=RW211))&&(LW10002<RW212))
     LB250 = 1;
        else LB250 = 0;

       WriteLocal("LB250",250,1,(void*)&buf7[0], 0);

/*
В такому вигляді працює, але як можна зробити, при досягненні системного часу LW10002, LW10001 значень RW210, RW211 (часи та хвилини включення системи) регістр LB250 встановлювався в 1, а при досягненні системного часу LW10002, LW10001 значень RW212, RW213 (часи та хвилини виключення системи) регістр LB250 встановлювався в 0. Тобто потрібен часовий тригер. чи може через оператор swich, але я не знаю як.
    return 0;
}

9

Re: Чому не працює макрос, щось зі стилістикою

А можна посилання на документацію? Особливо цікавить, що означають оці "RW" і "LB".
switch з точки зору логіки працює так само як і if-else.
І ви читаєте значення в буфери, а потім порівнюєте якісь LW10002>=RW210. Це точно працює? Чи випадково працює щось інше, а це не компілюється?

10

Re: Чому не працює макрос, щось зі стилістикою

https://www.google.com/search?q=kinco+h … s-wiz-serp

11

Re: Чому не працює макрос, щось зі стилістикою

https://en.kinco.cn/Download/D_enUserMa … Manual.pdf пункти 9(макрос)і 18(регістри)

Подякували: koala1

12

Re: Чому не працює макрос, щось зі стилістикою

int MacroEntry()
{
     unsigned short buf1[1], buf2[1], buf3 [1], buf4[1], buf5[1], buf6[1], buf7[1], buf8[1], buf9[7];
     ReadLocal("RW210",210,1,(void*)&buf1[0], 0);
     ReadLocal("RW211",211,1,(void*)&buf2[0], 0);
     ReadLocal("RW212",212,1,(void*)&buf3[0], 0);
     ReadLocal("RW213",213,1,(void*)&buf4[0], 0);
     ReadLocal("RW207",207,1,(void*)&buf8[0], 0);
     ReadLocal("RB2000",200.0,1,(void*)&buf9[0], 0);
     ReadLocal("LW10002",10002,1,(void*)&buf5[0], 0);
     ReadLocal("LW10001",10001,1,(void*)&buf6[0], 0);

   if((LW10002==RW210)&&(LW10001==RW211))
     RW250 = 1;
   if((LW10002==RW212)&&(LW10001==RW213))
     RW250 = 0;

       WriteLocal("RW250",250,1,(void*)&buf7[0], 0);

/*
задани массиви buf1-4 - заданий час вкл-викл. часи, хвилини, buf5,6 - час системний, buf7 - маркер день-ніч buf8 - дозвільний сигнал, buf9 дні тижня.
*/
    return 0;
}