📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//#include "SiUSBXp.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
SI_STATUS My_SI_STATUS;
bool IsShift=true;
bool ShutDown=false;
int FIRST_RUN=0;
BYTE OutArray[32];
BYTE InArray[64];
static BYTE DeviceCon;
DWORD BytesWritten=32;
DWORD dwBytesWritten = 0;
DWORD BytesRead=64;
DWORD dwBytesRead=0;
DWORD BytesReadRequest = 64 ;
int BytesSucceed = 0;
int X_0=0;
float II1;
float II2;
BYTE GetDeviceCon(void);
BYTE HByte(WORD);
BYTE LByte(WORD);
int combine(BYTE,BYTE);
void GatherData();
WORD SetData(float);
int SetCathodeData(int);
int SetIgniteData(int);
float SetACBreadthData(float);
int SetVOffsetData(int);
float SetACOffsetData(float);
float SetIadjBase1Data(float) ;
float SetIadjBase2Data(float);
float SetIadjSet1Data(float);
float SetIadjSet2Data(float);
float CnvLight1(float);
float CnvLight2(float);
float CnvVoffset(float);
float CnvVHV1(float);
float CnvIHV1(float);
float CnvVHV2(float);
float CnvIHV2(float);
float CnvLighVibrate1(float);
float CnvLighVibrate2(float);
float CnvBeatBreadth1(float);
float CnvBeatBreadth2(float);
float CnvTemp(float);
float CnvCathodeOffset(float);
float CnvVIgnite(float);
float CnvACBreadth(float);
float CnvVACVirtual(float);
float CnvIACVirtual(float);
float CnvVolt(float);
AnsiString myError();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hUSBDevice = INVALID_HANDLE_VALUE;
DWORD checkRXBytes, queueStatus;
//get the list of devices that are connected
DWORD numDevices = 0;
My_SI_STATUS=SI_GetNumDevices(&numDevices);
if(My_SI_STATUS==SI_SUCCESS)
{
Form1->Caption="已有"+AnsiString(numDevices)+"个USB设备连接。";
char deviceString[256];
for (int i=0; i<(int)numDevices;i++)
{
My_SI_STATUS = SI_GetProductString(i, deviceString, SI_RETURN_SERIAL_NUMBER);
Label18->Caption= deviceString;
//'return true since we found hardware
if (SI_Open(0, &hUSBDevice) == SI_SUCCESS)
{
My_SI_STATUS = SI_SetTimeouts(1000, 1000);
StatusBar1->Panels->Items[0]->Text="成功打开设备"+ myError();
}
else
StatusBar1->Panels->Items[0]->Text="设备打开错误"+ myError();
}
}
else
{
StatusBar1->Panels->Items[0]->Text="没有检测到设备"+ myError();
Form1->Caption="未检测到USB设备连接。";
}
for(BYTE i=0;i<32;i++)
OutArray[i]=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
GatherData();
OutArray[30] =0xFF;// 'HByte(TxtOut(17)) '保留,为0表示只设置,不回读
OutArray[31] =0xFF;// 'LByte(TxtOut(17)) '保留,为0表示只设置,不回读
for(BYTE i=0;i<64;i++)
InArray[i]=0;
DWORD lpdwReadTimeout;
DWORD lpdwWriteTimeout;
My_SI_STATUS=SI_GetTimeouts(&lpdwReadTimeout,&lpdwWriteTimeout);
My_SI_STATUS=SI_Write(hUSBDevice,OutArray,BytesWritten ,&dwBytesWritten) ;
if(My_SI_STATUS==SI_SUCCESS)
{
StatusBar1->Panels->Items[1]->Text="成功写"+AnsiString(dwBytesWritten)+"字节";
Button3->Enabled=true;
}
else
StatusBar1->Panels->Items[1]->Text="写错误:"+myError();//printError();
My_SI_STATUS=SI_Read(hUSBDevice, InArray, BytesRead, &dwBytesRead,0); // (BYTE *)&
StatusBar1->Panels->Items[2]->Text="读错误:"+ myError();//printError();
if(My_SI_STATUS==SI_SUCCESS)
{
StatusBar1->Panels->Items[2]->Text="成功读"+AnsiString(dwBytesRead)+"字节";
//阴极偏压采样
float CCOS=-CnvCathodeOffset(combine(InArray[26], InArray[27]));
Edit5->Text=AnsiString(CCOS);
Series1->AddXY(X_0,CCOS,"",clBlue);
//引燃高压采样
float CVI=CnvVIgnite(combine(InArray[28], InArray[29]));
Edit6->Text=AnsiString(CVI);
Series2->AddXY(X_0,CVI,"",clBlue);
//高压调流1电压采样
float CVHV1=-CnvVHV1(combine(InArray[8], InArray[9]));
Edit9->Text=AnsiString(CVHV1);
Series5->AddXY(X_0,CVHV1,"",clBlue);
//高压调流1电流采样
float CVHI1=-CnvIHV1(combine(InArray[10], InArray[11]));
Edit7->Text=AnsiString(CVHI1);
Series3->AddXY(X_0,CVHI1,"",clBlue);
//高压调流2电压采样
float CVHV2=-CnvVHV2(combine(InArray[12], InArray[13]));
Edit10->Text=AnsiString(CVHV2);
Series6->AddXY(X_0,CVHV2,"",clBlue);
//高压调流2电流采样
float CVHI2=-CnvIHV2(combine(InArray[14], InArray[15]));
Edit8->Text=AnsiString(CVHI2);
Series4->AddXY(X_0,CVHI2,"",clBlue);
Label26->Caption=AnsiString(InArray[48]); //机器号
Label27->Caption=AnsiString(InArray[49]); //状态字
Label29->Caption=AnsiString(OutArray[26]); //控制字
X_0++; //横坐标累加
// for(int i=0;i<64;i++)
// Memo2->Lines->Add(AnsiString(i)+":"+InArray[i]);
// if(CVHV1<100|CVHV2<100)
// {
// if(Edit1->Text.ToInt()>2400)
// {
// Edit1->Text=Edit1->Text.ToInt()+100;
// Button2Click(Sender);
// }
// }
// if(CVHV1>300|CVHV2>300)
// {
// if(Edit1->Text.ToInt()>100)
// {
// Edit1->Text=Edit1->Text.ToInt()-100;
// Button2Click(Sender);
// }
// }
Form1->Caption=OutArray[10];
}
else
{
StatusBar1->Panels->Items[0]->Text= myError();
}
}
//---------------------------------------------------------------------------
//'设置数转换
void GatherData()
{
WORD IadjSet1= SetData(SetIadjSet1Data(Form1->Edit3->Text.ToDouble()));//
WORD IadjSet2= SetData(SetIadjSet2Data(Form1->Edit4->Text.ToDouble()));
WORD CathodeSet = SetData(SetCathodeData(Form1->Edit1->Text.ToInt()));
WORD IgniteSet = SetData(SetIgniteData(Form1->Edit2->Text.ToInt()));
WORD VOffsetSet1 = SetData(SetVOffsetData(0));
// WORD VOffsetSet2 = SetData(SetVOffsetData(0));
WORD ACBreadthSet = SetData(SetACBreadthData(0));
WORD ACOffsetSet = SetData(SetACOffsetData(0));
WORD FreqAdjStepMin =0; // '稳频调节小步距
WORD FreqAdjStepMax =0; // '稳频调节大步距
//WORD FreqVoltBase = 0; // '稳频电压初始点
WORD FreqVoltBase = SetData(SetVOffsetData(0));
WORD IadjBase1 = SetData(SetIadjBase1Data(0)); // '高压调流初始值1
WORD IadjBase2 = SetData(SetIadjBase2Data(0)); // '高压调流初始值2
DeviceCon = GetDeviceCon(); //'控制字
//高压调流设定值1
OutArray[0] = HByte(IadjSet1);
OutArray[1] = LByte(IadjSet1);
// 高压调流设定值2
OutArray[2] = HByte(IadjSet2);
OutArray[3] = LByte(IadjSet2);
//阴极偏压设定值
OutArray[4] = HByte(CathodeSet);
OutArray[5] = LByte(CathodeSet);
//阳极引燃设定值
OutArray[6] = HByte(IgniteSet);
OutArray[7] = LByte(IgniteSet);
//偏压电压1设定值
OutArray[8] = HByte(VOffsetSet1);
OutArray[9] = LByte(VOffsetSet1);
//偏压电压2设定值
OutArray[10] =BYTE(0);// HByte(VOffsetSet2);
OutArray[11] =BYTE(0);// LByte(VOffsetSet2);
//交流驱动幅值设定值
OutArray[12] = HByte(ACBreadthSet);
OutArray[13] = LByte(ACBreadthSet);
//交流驱动偏置设定值
OutArray[14] = HByte(ACOffsetSet);
OutArray[15] = LByte(ACOffsetSet);
//保留
OutArray[16]=0;
OutArray[17]=0;
OutArray[18] = FreqAdjStepMin;// '稳频调节小步距
OutArray[19] = FreqAdjStepMax;// '稳频调节大步距
OutArray[20] = HByte(FreqVoltBase);// '稳频电压初始点
OutArray[21] = LByte(FreqVoltBase);
OutArray[22] = HByte(IadjBase1);// '高压调流初始值1
OutArray[23] = LByte(IadjBase1);
OutArray[24] = HByte(IadjBase2);// '高压调流初始值2
OutArray[25] = LByte(IadjBase2);
OutArray[26] = DeviceCon; //'控制字
// OutArray(27) '保留
// OutArray(28) '保留
// OutArray(29) '保留
OutArray[27] = 0x4;// '抖动频率高8位
OutArray[28] = 0xEA;// '抖动频率中8位'450Hz
OutArray[29] = 0x4A;// '抖动频率低8位'450Hz
OutArray[30] =0;// 'HByte(TxtOut(17)) '保留,为0表示只设置,不回读
OutArray[31] =0;// 'LByte(TxtOut(17)) '保留,为0表示只设置,不回读
}
// 设置转换
WORD SetData(float Volt ) //设置电压数转为16进制数
{
return (Volt/10.24*0x7FFF)+0x8000;
}
//阴极偏压设置
int SetCathodeData(int Volt)
{
return Volt/250; //'500
}
//阳极引燃电压设置
int SetIgniteData(int Volt)
{
return Volt/300;// '600 '* 2
}
//'偏置电压
int SetVOffsetData(int Volt)
{
return Volt*8.0/160.0;
}
//'交流幅值设定
float SetACBreadthData(float Volt)
{
return Volt / 65.0 * 10.24;
}
//'交流偏置设定
float SetACOffsetData(float Volt)
{
return Volt/10.0;//#
}
//'高压调流1初始值
float SetIadjBase1Data(float Current)
{
float SetIadjBase1Data0 = -(Current / 1000 * 4700 + 0.65);
if (IsShift)
SetIadjBase1Data0 = -(Current / 1000 * 824.561 + 0.65); //'换档
return SetIadjBase1Data0;
}
//'高压调流2初始值
float SetIadjBase2Data(float Current)
{
float SetIadjBase2Data0 = -(Current / 1000 * 4700 + 0.65);
if (IsShift)
SetIadjBase2Data0 = -(Current / 1000 * 824.561 + 0.65); //'换档
return SetIadjBase2Data0;
}
//'高压调流1设置值
float SetIadjSet1Data(float Current)
{
float SetIadjSet1Data0 = -Current / 1000 * 4700 ;//'7186
if(IsShift)
SetIadjSet1Data0 = -Current / 1000 * 824.561;
return SetIadjSet1Data0;
}
//'高压调流2设置值
float SetIadjSet2Data(float Current)
{
float SetIadjSet2Data0 = -Current / 1000 * 4700; //'7186
if(IsShift)
SetIadjSet2Data0 = -Current / 1000 * 824.4561;
return SetIadjSet2Data0;
}
//'获得一个整数的高字节
BYTE HByte(WORD data)
{
WORD Temp;
Temp = data&0xFF00;
Temp = Temp/256;
//if (Temp < 0) Temp =Temp+ 256; // temp=temp>>8;
return Temp;
}
//'获得一个整数的低字节
BYTE LByte(WORD data)
{
WORD Temp;
Temp = data;
Temp = Temp&0x00FF;
return Temp;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
GatherData();
My_SI_STATUS=SI_Write(hUSBDevice, OutArray,BytesWritten ,&dwBytesWritten);
if(My_SI_STATUS==SI_SUCCESS)
{
StatusBar1->Panels->Items[1]->Text="成功写"+AnsiString(dwBytesWritten)+"字节";
Button1Click(Sender);
Button2->Enabled=true;
Button3->Enabled=true;
Button6->Enabled=true;
}
else
StatusBar1->Panels->Items[1]->Text="写错误:"+myError();//printError();
}
//---------------------------------------------------------------------------
BYTE GetDeviceCon(void)
{
BYTE Temp= 0;
// If (ChkFreeOn.Value) Then Temp = Temp Or &H1 ': ChkFreeOn.Value = False '引燃
if(Form1->CheckBox1->Checked)
Temp=Temp|0x1;
// 1路开
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -