Просмотр полной версии : Макрос для СП307-Р, сравнение введенных данных с заданным значением
RabochiyAkk
19.11.2024, 15:54
Здравствуйте. Хотела сделать следующий макрос: с панели с помощью цифрового ввода вбивается значение типа float, сравнивается с уставкой и если оно больше, то на цифровом дисплее появляется значение 1. Почему-то не работает как задумано, при вводе любого значения больше 0 на цифровом дисплее появляется 1. Ниже код пользовательского макроса, в глобальном ничего нет.
float val = PSW[304];
if (7 < val)
{
PSW[308] = 1;
}
else
{
PSW[308] = 0;
}
При этом такой макрос работает нормально:
float val = PSW[304];
float val1 = PSW[306];
if (val1 < val)
{
PSW[308] = 1;
}
else
{
PSW[308] = 0;
}
kondor3000
19.11.2024, 16:05
7 < val, у вас разные типы данных. Число 7 без точки это целочисленный тип, float пишется как 7.0
Вот видео https://www.youtube.com/watch?v=MxEUeiGtKdo
RabochiyAkk
19.11.2024, 16:08
Пробовал так еще, тоже не работал
float val = PSW[304];
float val1 =7;
if (7 < val)
{
PSW[308] = 1;
}
else
{
PSW[308] = 0;
}
RabochiyAkk
19.11.2024, 16:14
Спасибо большое
RabochiyAkk
09.12.2024, 12:46
Добрый день! Вдруг есть возможность подсказать. Усложняю макрос и опять возникла проблема с типами данных. В цикле должен происходить прием и запись данных в регистр psw304, затем сравнение его с уставкой из регистра psw306. Если psw304>psw306, то в регистр psw308 записывается значение 1. psw306 и psw304 числа типа float. В прошлый раз сделано было все согласно видеоуроку, который вы скинули, сработало. Но вот хочу перенести это в цикл приема ответа с датчика, чтобы ответ от датчика сравнивался с уставкой. Ответ приходит, но сравнение происходит неправильно, хотя вроде бы сравниваю переменную с переменной, тип один
void ProcessResponseAndAlarm(BYTE *response, float SetPoint, WORD BitNumber)
{
float val;
char str[8];
strncpy(str, (char*)&response[7], 7);
str[7] = '\0';
val = atof(str);
*(float*)(PSW + 304) = val;
if (val > SetPoint)
{
SetPSB(BitNumber);
}
else
{
ResetPSB(BitNumber);
}
}
void SendPressureRequest(WORD Port, float SetPoint, WORD BitNumber)
{
BYTE DataSend[11];
BYTE DataReceive[40];
WORD ReceiveSize;
DataSend[0] = 0x40;
DataSend[1] = 0x32;
DataSend[2] = 0x35;
DataSend[3] = 0x33;
DataSend[4] = 0x50;
DataSend[5] = 0x52;
DataSend[6] = 0x31;
DataSend[7] = 0x3F;
DataSend[8] = 0x3B;
DataSend[9] = 0x46;
DataSend[10] = 0x46;
Enter(Port);
Send(Port, DataSend, sizeof(DataSend));
ReceiveSize = Receive(Port, DataReceive, sizeof(DataReceive), 5000, 6);
Leave(Port);
if (ReceiveSize > 0)
{
ProcessResponseAndAlarm(DataReceive, SetPoint, BitNumber);
}
}
ну очевидно же что нужно на каждом шаге куда то выводить промежутчные результаты
Здесь отладчик, мягко сказать не могу, поэтому промолчу.
RabochiyAkk
10.12.2024, 14:02
Спасибо, не могли бы вы уточнить, что выводить, не совсем понимаю
RabochiyAkk
10.12.2024, 15:19
Вообще еще не совсем понимаю, что правильнее помещать в глобальный макрос и в пользовательский
Вообще еще не совсем понимаю, что правильнее помещать в глобальный макрос и в пользовательский
В глобальный - свои функции
80698
#define DEBUG_ENB 1
#if DEBUG_ENB
#include <stdarg.h>
#define DEBUG(...) realdprintf(__FILE__, __LINE__, __func__, __VA_ARGS__)
#else
#define DEBUG(...)
#endif
void realdprintf (char const *file, int line, char const *func, unsigned delay, char const *format, ...);
/*
There may be global variables and user-defined functions, for example
int a, b, c;
void Test(void) {
PSW[256] = PSW[256] + 1;
return;
}
etc...
*/
/* DEBUG Print */
void realdprintf (char const *file, int line, char const *func, unsigned delay, char const *format, ...)
{
#define winNo 5004 //Debug window number
#define LTOTAL 6 //Number of lines in the debug window
#define CTOTAL 56 //Number of characters in one line of the debug window
#define INPUT PSW[136] //Window control buttons
#define SCRADDR PSW[139] //Initial address of the screen buffer
#define TIC (*(DWORD*) (PSW + 38)) //System timer
#define TABS 8
#define OK 0
#define LEFT 1
#define RIGHT 2
#define KbdStatus(bitno) ((INPUT) & (1 << (bitno)))
#define FORWARD 1
#define BACKWARD -1
char *pBuffScr;
char *pBuffPrint = Malloc((LTOTAL -1) * CTOTAL);
BYTE *saveREGS = Malloc(LTOTAL * CTOTAL);
WORD saveREG1, saveREG2;
static int Xpos = 0, Ypos = 0;
register int t, len2;
int len1, len3, dir;
unsigned long tm;
va_list arg;
/* Save working registers */
saveREG1 = INPUT;
saveREG2 = SCRADDR;
/* Calculate the initial address of the screen buffer */
SCRADDR = PSW[10] - LTOTAL * CTOTAL/2;
pBuffScr = (char*) &PSW[SCRADDR];
/* Save the registers of the screen buffer area */
memcpy(saveREGS, pBuffScr, LTOTAL * CTOTAL);
/* Clear screen buffer */
memset(pBuffScr, ' ', LTOTAL * CTOTAL);
/* Print to screen line #1 */
len1 = sprintf(pBuffScr, "> %s line %d in %s ", func, line, file);
len2 = CTOTAL + Max(0, len1-CTOTAL);
/* remaining print lines in the buffer */
va_start(arg, format);
len3 = vsnprintf (pBuffPrint, LTOTAL * CTOTAL - len2 - 1, format, arg);
va_end(arg);
pBuffPrint[len3] = '\0';
/* Display buffer on screen */
t= 0;
do {
switch(pBuffPrint[t]) {
case '\a': //Bell
Beep();
break;
case '\t': //Tab
len2 = len2 - len2 % TABS + TABS;
break;
case '\n': //LF
len2 = len2 - len2 % CTOTAL + CTOTAL;
break;
default:
pBuffScr[len2] = pBuffPrint[t];
len2++;
}
t++;
} while (pBuffPrint[t] !=0 && len2 < (LTOTAL * CTOTAL));
/* Call the debug window and control its position */
dir = FORWARD;
tm = TIC;
while(!(KbdStatus(OK) || (delay !=0 && (TIC-tm) >= delay*10)) ) {
if (KbdStatus(RIGHT)) {
tm = TIC;
CloseWindow(winNo);
Xpos = Xpos + 100;
}
if (KbdStatus(LEFT)) {
tm = TIC;
CloseWindow(winNo);
Xpos = Xpos - 100;
if (Xpos < 0) {
Xpos = 0;
Ypos = Ypos + dir * 100;
}
if (Ypos == 400) dir = BACKWARD;
if (Ypos == 0) dir = FORWARD;
}
OpenWindow(winNo, Xpos, Ypos);
INPUT = 0;
Delay(10);
}
CloseWindow(winNo);
/* Restore working registers */
memcpy(pBuffScr, saveREGS, LTOTAL * CTOTAL);
INPUT = saveREG1;
SCRADDR = saveREG2;
/* Deallocate memory blocks */
Free(pBuffPrint);
Free(saveREGS);
}
В пользовательском - используем эти функции
80699
int a, b, c;
a= 2;
b = PSW[250];
c = a + b;
DEBUG(20, " This is my test\n a= %d b= %d c= %d", a, b, c);
PSW[300] = 100;
PSW[400] = PSW[256] + PSW[300];
DEBUG(30, "PSW[256]= %d PSW[300]= %d PSW[400]= %d", PSW[256], PSW[300], PSW[400]);
Файл с примером - здесь https://owen.ru/forum/showthread.php?t=26783&p=251022&viewfull=1#post251022
RabochiyAkk
15.01.2025, 11:33
Спасибо всем. Разобралась. Все работает.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot