PC上对于西门子PLC S5Time的转换
前些日子有朋友问我,怎么在pc上对西门子plc 的时间型的值进行转化
以下是转换的过程(VC编写的):
Code
//OPC读到的值转成实际参数值
int CMachineParameterDlg::GetRealMachineParameter(int init)
{
int qianwei,baiwei,shiwei,gewei;
int beishu;
int result;
qianwei=init/4096; init=init%4096;
baiwei=init/256; init=init%256;
shiwei=init/16; gewei=init%16;
switch(qianwei)
{
case 0:
beishu=10;
break;
case 1:
beishu=100;
break;
case 2:
beishu=1000;
break;
case 3:
beishu=10000;
break;
}
result=(baiwei*100+shiwei*10+gewei)*beishu;
return result;
}
//实际参数值转成OPC里PLC的实际值
int CMachineParameterDlg::ToPLCMachineParameter(int init)
{
int qianwei,baiwei,shiwei,gewei;
//int beishu;
int result;
if(0<=init&&init<=4095)
{
init=init/10;
qianwei=0;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
else if(0<=init/10&&init/10<=4095)
{
init=init/100;
qianwei=1;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
else if(0<=init/100&&init/100<=4095)
{
init=init/1000;
qianwei=2;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
else if(0<=init/1000&&init/1000<=4095)
{
init=init/10000;
qianwei=3;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
return result;
}
//OPC读到的值转成实际参数值
int CMachineParameterDlg::GetRealMachineParameter(int init)
{
int qianwei,baiwei,shiwei,gewei;
int beishu;
int result;
qianwei=init/4096; init=init%4096;
baiwei=init/256; init=init%256;
shiwei=init/16; gewei=init%16;
switch(qianwei)
{
case 0:
beishu=10;
break;
case 1:
beishu=100;
break;
case 2:
beishu=1000;
break;
case 3:
beishu=10000;
break;
}
result=(baiwei*100+shiwei*10+gewei)*beishu;
return result;
}
//实际参数值转成OPC里PLC的实际值
int CMachineParameterDlg::ToPLCMachineParameter(int init)
{
int qianwei,baiwei,shiwei,gewei;
//int beishu;
int result;
if(0<=init&&init<=4095)
{
init=init/10;
qianwei=0;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
else if(0<=init/10&&init/10<=4095)
{
init=init/100;
qianwei=1;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
else if(0<=init/100&&init/100<=4095)
{
init=init/1000;
qianwei=2;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
else if(0<=init/1000&&init/1000<=4095)
{
init=init/10000;
qianwei=3;
baiwei=init/100; init=init%100;
shiwei=init/10; gewei=init%10;
result=qianwei*4096+baiwei*256+shiwei*16+gewei;
}
return result;
}
以下是其调用过程:
Code
opcoperate.SyncRead(opc_Delay_Electromagnet,Group_Delay_Electromagnet_ItemID,(MaxDelayElectromagnetBit-MinDelayElectromagnetBit)/2+1,items_value);//机器参数数据
for(i=0;i<(MaxDelayElectromagnetBit-MinDelayElectromagnetBit)/2+1;i++)//数量转换,得到各参数数值
{
*m_Scroll_Delay_Electromagnet_int[i+1]=*m_Edit_Delay_Electromagnet[i+1]=GetRealDelayElectromagnet(atoi(items_value[i]));
}
opcoperate.SyncRead(opc_Delay_Electromagnet,Group_Delay_Electromagnet_ItemID,(MaxDelayElectromagnetBit-MinDelayElectromagnetBit)/2+1,items_value);//机器参数数据
for(i=0;i<(MaxDelayElectromagnetBit-MinDelayElectromagnetBit)/2+1;i++)//数量转换,得到各参数数值
{
*m_Scroll_Delay_Electromagnet_int[i+1]=*m_Edit_Delay_Electromagnet[i+1]=GetRealDelayElectromagnet(atoi(items_value[i]));
}
Code
for(int i=0;i<(MaxMachineParameterBit-MinMachineParameterBit)/2+1;i++)
{
New_Machine_Parameter[i]=*m_Edit_Machine_Parameter[i+1];
items_value[i].Format("%d",ToPLCMachineParameter(New_Machine_Parameter[i]));
}
for(int i=0;i<(MaxMachineParameterBit-MinMachineParameterBit)/2+1;i++)
{
New_Machine_Parameter[i]=*m_Edit_Machine_Parameter[i+1];
items_value[i].Format("%d",ToPLCMachineParameter(New_Machine_Parameter[i]));
}