i everyone, i made some code to simulate the working of a shade motor and but it dosent work because an error appear which states An Access Violation Segmentation Fault raised in your program, i dont know what to do, perhaps you guys can figure that out.
Code:
#include <iostream>
using namespace std;
struct NVAR_DigitalOutputOnOff
{
bool wm_bc;
bool do_bc;
bool do_bs;
};
struct VAR_DigitalOutputOnOff
{
bool dom_bs;
bool doa_bs;
};
struct NVAR_DigitalInput
{
bool di_bs;
};
struct NVAR_ShadeVar
{
int shadeVar;
int shadeTime;
int shadeRef;
int shadeOff;
int temp_time;
char flag_shade;
};
struct MainModule
{
NVAR_DigitalOutputOnOff digOutN[2];
VAR_DigitalOutputOnOff digOutV[2];
NVAR_DigitalInput digInpN[2];
NVAR_ShadeVar m01_var[1];
};
void shadeM01(
NVAR_DigitalOutputOnOff *digOut1N,
NVAR_DigitalOutputOnOff *digOut2N,
VAR_DigitalOutputOnOff *digOut1V,
VAR_DigitalOutputOnOff *digOut2V,
NVAR_DigitalInput *digInp3,
NVAR_DigitalInput *digInp4,
NVAR_ShadeVar *shadeVar,
int shade_time)
{
if (digOut1N->wm_bc // Q1 MANUAL
&& digOut2N->wm_bc) // Q2 MANUAL
{
if (shadeVar->flag_shade == 0) // ZALUZIJE MIRUJEJO
{
if ((digInp3->di_bs
^ digOut1N->do_bc)
&& !digInp4->di_bs
&& !digOut2N->do_bc) // KOMANDA TOUCHA SPUSCANJA NI AKTIVNA
{
shadeVar->flag_shade = 1;
// digOut2->dom_bs = 0;
} else digOut1V->dom_bs = 0;
if ((digInp4->di_bs
^digOut2N->do_bc)
&& !digInp3->di_bs
&& !digOut1N->do_bc)
{
shadeVar->flag_shade = 2;
// digOut1->dom_bs = 0;
} else digOut2V->dom_bs = 0;
}
else if (shadeVar->flag_shade == 1) // ODPIRANJE ZALUZIJ
{
if (shadeVar->shadeTime < shade_time)
{
if (digInp3->di_bs
^digOut1N->do_bc)
{
if (shadeVar->temp_time < 833)
{
shadeVar->temp_time++;
digOut1V->dom_bs = 1;
}
else if (shadeVar->temp_time == 833)
{
shadeVar->temp_time = 0;
shadeVar->shadeTime++;
}
}
else
{
if (shadeVar->temp_time < 833)
{
shadeVar->temp_time++;
digOut1V->dom_bs = 1;
}
else if (shadeVar->temp_time == 833)
{
digOut1V->dom_bs = 0;
if (shadeVar->shadeOff < 255)
{
shadeVar->shadeOff++;
}
else if (shadeVar->shadeOff == 255)
{
shadeVar->shadeTime++;
shadeVar->flag_shade = 0;
shadeVar->shadeOff = 0;
shadeVar->temp_time = 0;
}
}
}
}
else
{ // ZALUZIJE ODPRTE
digOut1V->dom_bs = 0;
digOut1N->do_bc = 0;
shadeVar->shadeTime = shade_time;
shadeVar->flag_shade = 0;
}
}
else if (shadeVar->flag_shade == 2) // ZAPIRANJE ZALUZIJ
{
if (shade_time > 0)
{
if (digInp4->di_bs
^digOut2N->do_bc)
{
if (shadeVar->temp_time < 833)
{
shadeVar->temp_time++;
digOut2V->dom_bs = 1;
}
else if (shadeVar->temp_time == 833)
{
shadeVar->temp_time = 0;
shadeVar->shadeTime--;
}
}
else
{
if (shadeVar->temp_time < 833)
{
shadeVar->temp_time++;
digOut2V->dom_bs = 1;
}
else if (shadeVar->temp_time == 833)
{
digOut2V->dom_bs = 0;
if (shadeVar->shadeOff < 255)
{
shadeVar->shadeOff++;
}
else if (shadeVar->shadeOff == 255)
{
shadeVar->shadeTime--;
shadeVar->flag_shade = 0;
shadeVar->shadeOff = 0;
shadeVar->temp_time = 0;
}
}
}
}
else
{ // ZALUZIJE ZAPRTE
digOut2V->dom_bs = 0;
digOut2N->do_bc = 0;
shadeVar->shadeTime = 0;
shadeVar->flag_shade = 0;
}
}
//vpisi8(nvvar,shadeRef, shadeVar->shade_time);
}
}
//MainModule *MM;
int main()
{
int shade_time = 0;
cout << "Digital output 1: " << endl;
cout << "insert 1 - manual mode" << endl;
cout << "insert 0 - auto mode" << endl;
cin >> MM->digOutN[0].wm_bc;
cout << "Digital output 2: " << endl;
cout << "insert 1 - manual mode" << endl;
cout << "insert 0 - auto mode" << endl;
cin >> MM->digOutN[1].wm_bc;
shadeM01(&MM->digOutN[0], //NVAR_DigitalOutputOnOff *digOut1N
&MM->digOutN[1], //NVAR_DigitalOutputOnOff *digOut2N
&MM->digOutV[0], //VAR_DigitalOutputOnOff *digOut1V
&MM->digOutV[1], //VAR_DigitalOutputOnOff *digOut2V
&MM->digInpN[0], //NVAR_DigitalInput *digInp3
&MM->digInpN[1], //NVAR_DigitalInput *digInp4
&MM->m01_var[0], //NVAR_ShadeVar *shadeVar
shade_time); //int shade_time
cout << "State of first output" << MM->digOutN[0].do_bs << endl;
cout << "State of second output" << MM->digOutN[1].do_bs << endl;
return 0;
}
Best Regards,
Boschow.
