GrpcPrint/PrintC/PLC/AxisState.cpp

257 lines
9.1 KiB
C++
Raw Normal View History

2024-05-06 10:49:15 +08:00
#include "AxisState.h"
#include "../Communication/S7Command.h"
#include "../config/ConfigManager.h"
#include "../Logger.h"
#include "../DataManage/DataHandle.h"
AxisState::AxisState()
{
size_t ptrSize = sizeof(nullptr); //指针大小
void* startPtr = &m_startFlag + 1;
size_t count = ((size_t)&m_endFlag - (size_t)startPtr) / ptrSize;
InsertMp(startPtr, count);
}
AxisState::~AxisState() {
std::shared_lock<std::shared_mutex> lock(mtx);
for (auto item = m_baseMp.begin(); item != m_baseMp.end(); ++item) {
delete item->second;
}
m_baseMp.clear();
}
void AxisState::GetValue(AxisStateValue& value)
{
std::shared_lock<std::shared_mutex> lock(mtx);
value.ServoOn = m_ServoOn->GetValue();
value.ServoHomeIndexOn = m_ServoHomeIndexOn->GetValue();
value.ServoReset = m_ServoReset->GetValue();
value.MoveP = m_MoveP->GetValue();
value.MoveN = m_MoveN->GetValue();
value.MovePContinue = m_MovePContinue->GetValue();
value.MoveNContinue = m_MoveNContinue->GetValue();
value.MoveAbsPos = m_MoveAbsPos->GetValue();
value.MotionStop = m_MotionStop->GetValue();
value.ServoRDY = m_ServoRDY->GetValue();
value.ServoHomeDone = m_ServoHomeDone->GetValue();
value.ResetDone = m_ResetDone->GetValue();
value.ServoException = m_ServoException->GetValue();
value.Runable = m_Runable->GetValue();
value.ExceptionCode = m_ExceptionCode->GetValue();
value.Pos = m_Pos->GetValue();
value.Torque = m_Torque->GetValue();
value.ServoBusy = m_ServoBusy->GetValue();
}
//void AxisState::Update(unsigned char* addr)
//{
// std::unique_lock<std::shared_mutex> lock(mtx);
// m_ServoOn= ((addr[0] & 0x1)>0 ? true : false);
// m_ServoHomeIndexOn= ((addr[0] & 0x2)>0 ? true : false);
// m_ServoReset= ((addr[0] & 0x4)>0 ? true : false);
// m_MoveP= ((addr[0] & 0x8)>0 ? true : false);
// m_MoveN= ((addr[0] & 0x10)>0 ? true : false);
// m_MovePContinue= ((addr[0] & 0x20)>0 ? true : false);
// m_MoveNContinue= ((addr[0] & 0x40)>0 ? true : false);
// m_MoveAbsPos= ((addr[0] & 0x80)>0 ? true : false);
// m_MotionStop= ((addr[1] & 0x1)>0 ? true : false);
// m_ServoRDY= ((addr[1] & 0x2)>0 ? true : false);
// m_ServoHomeDone= ((addr[1] & 0x4)>0 ? true : false);
// m_ResetDone= ((addr[1] & 0x8)>0 ? true : false);
// m_ServoBusy= ((addr[1] & 0x10)>0 ? true : false);
// m_ServoException= ((addr[1] & 0x20)>0 ? true : false);
// m_Runable= ((addr[1] & 0x40)>0 ? true : false);
// m_ExceptionCode = S7WORDDATA(addr[3], addr[2]).wValue;
//}
void AxisState::Update(const ReadData& rd)
{
std::unique_lock<std::shared_mutex> lock(mtx);
if (!rd.result) {
printf("data is error...");
return;
}
for (auto& it : rd.its) {
if (m_baseMp.find(it.nameKey) == m_baseMp.end()) {
printf("error, key %s do not find...\n", it.nameKey.c_str());
continue;
}
if(it.valueType == DATATYPE::iBOOL){
m_baseMp[it.nameKey]->SetValue((bool)stoi(it.strValue));
}
else if (it.valueType == DATATYPE::iINT) {
m_baseMp[it.nameKey]->SetValue(stoi(it.strValue));
}
else if (it.valueType == DATATYPE::iSHORT) {
m_baseMp[it.nameKey]->SetValue((short)stoi(it.strValue));
}
else if (it.valueType == DATATYPE::iFLOAT) {
m_baseMp[it.nameKey]->SetValue(stof(it.strValue));
}
else {
printf("error,type:%d do not find...\n", it.valueType);
}
}
}
//void AxisState::UpdatePosAndLoad(unsigned char* addr)
//{
// int index = 0;
// std::unique_lock<std::shared_mutex> lock(mtx);
// m_Pos = (S7FLOATDATA(addr[index + 3], addr[index + 2], addr[index + 1], addr[index]).fValue); index += 4;
// m_Torque = (S7FLOATDATA(addr[index + 3], addr[index + 2], addr[index + 1], addr[index]).fValue); index += 4;
//
// if (!m_AxisCfg->m_ShowPosInv) {
// m_ShowPos = m_Pos - m_AxisCfg->m_ShowRefZero;
// }
// else {
// m_ShowPos = -(m_Pos - m_AxisCfg->m_ShowRefZero);
// }
//
// m_RPos = m_ShowPos / (m_AxisCfg->m_active_limit - m_AxisCfg->m_negactive_limit);
//}
float AxisState::GetShowPos()
{
float showPos = 0.0f;
std::unique_lock<std::shared_mutex> lock(mtx);
showPos = m_ShowPos->GetValue();
return showPos;
}
void AxisState::SetZeroPos()
{
m_AxisCfg->m_ShowRefZero->SetValue(m_Pos->GetValue());
//ConfigManager::Instance()->UpdateZeroOffset(m_AxisCfg->m_axis_id, m_AxisCfg->m_ShowRefZero);
DataHandle::Instance()->SetPushMsg(SETZEROPOS, std::to_string(m_AxisCfg->m_axis_id),std::to_string(m_AxisCfg->m_ShowRefZero->GetValue()),UNKNOW);
}
void AxisState::InsertMp(void* startPtr, size_t count, const string& suff) {
size_t ptrSize = sizeof(nullptr); //指针大小
for (size_t i = 0; i < count; ++i) {
BaseData* bd = *((BaseData**)((char*)startPtr + ptrSize * i));
string key = bd->GetCode() + suff;
if (m_baseMp.find(key) != m_baseMp.end()) {
printf("%s is repeated...\n", key.data());
}
else { m_baseMp.insert(make_pair(key, bd)); }
}
}
void MainAxisState::GetValue(AxisStateValue& value)
{
std::shared_lock<std::shared_mutex> lock(mtx);
value.ServoOn = m_ServoOn->GetValue();
value.ServoHomeIndexOn = m_ServoHomeIndexOn->GetValue();
value.ServoReset = m_ServoReset->GetValue();
value.MoveP = m_MoveP->GetValue();
value.MoveN = m_MoveN->GetValue();
value.MovePContinue = m_MovePContinue->GetValue();
value.MoveNContinue = m_MoveNContinue->GetValue();
value.MoveAbsPos = m_MoveAbsPos;
value.MotionStop = m_MotionStop->GetValue();
value.ServoRDY = m_ServoRDY->GetValue();
value.ServoHomeDone = m_ServoHomeDone->GetValue();
value.ResetDone = m_ResetDone->GetValue();
value.ServoException = m_ServoException->GetValue();
value.Runable = m_Runable->GetValue();
value.ExceptionCode = m_ExceptionCode->GetValue();
value.Pos = m_Pos->GetValue();
value.Torque = m_Torque->GetValue();
value.ShowPos = m_ShowPos->GetValue();
value.RPos = m_RPos->GetValue();
value.ServoBreakOn = m_ServoBreakOn->GetValue();
value.BindSlaveOn = m_BindSlaveOn->GetValue();
value.BindSlaveFinish = m_BindSlaveFinish->GetValue();
value.ServoBusy = m_ServoBusy->GetValue();
}
//void MainAxisState::Update(unsigned char* addr)
//{
// std::unique_lock<std::shared_mutex> lock(mtx);
// m_ServoOn= ((addr[0] & 0x1)>0 ? true : false);
// m_ServoHomeIndexOn= ((addr[0] & 0x2)>0 ? true : false);
// m_ServoReset= ((addr[0] & 0x4)>0 ? true : false);
// m_ServoBreakOn= ((addr[0] & 0x8)>0 ? true : false);
// m_BindSlaveOn= ((addr[0] & 0x10)>0 ? true : false);
// m_MoveP= ((addr[0] & 0x20)>0 ? true : false);
// m_MoveN= ((addr[0] & 0x40)>0 ? true : false);
// m_MovePContinue= ((addr[0] & 0x80)>0 ? true : false);
// m_MoveNContinue= ((addr[1] & 0x1)>0 ? true : false);
// m_MoveAbsPos= ((addr[1] & 0x2)>0 ? true : false);
// m_MotionStop= ((addr[1] & 0x4)>0 ? true : false);
// m_ServoRDY= ((addr[1] & 0x8)>0 ? true : false);
// m_ServoHomeDone= ((addr[1] & 0x10)>0 ? true : false);
// m_ResetDone= ((addr[1] & 0x20)>0 ? true : false);
// bool lastServoBusy = m_ServoBusy;
// m_ServoBusy= ((addr[1] & 0x40)>0 ? true : false);
//// if (lastServoBusy && !m_ServoBusy) {
//// g_log->TraceInfo("轴忙转换为:%d",m_ServoBusy?1:0);
//// }
//
// m_ServoException= ((addr[1] & 0x80)>0 ? true : false);
// m_BindSlaveFinish= ((addr[2] & 0x1)>0 ? true : false);
// m_Runable= ((addr[2] & 0x2)>0 ? true : false);
// m_ExceptionCode = S7WORDDATA(addr[5], addr[4]).wValue;
//}
void SlaveAxisState::GetValue(AxisStateValue& value)
{
std::shared_lock<std::shared_mutex> lock(mtx);
value.ServoOn = m_ServoOn->GetValue();
value.ServoHomeIndexOn = m_ServoHomeIndexOn->GetValue();
value.ServoReset = m_ServoReset->GetValue();
value.MoveP = m_MoveP->GetValue();
value.MoveN = m_MoveN->GetValue();
value.MovePContinue = m_MovePContinue->GetValue();
value.MoveNContinue = m_MoveNContinue->GetValue();
value.MoveAbsPos = m_MoveAbsPos->GetValue();
value.MotionStop = m_MotionStop->GetValue();
value.ServoRDY = m_ServoRDY->GetValue();
value.ServoHomeDone = m_ServoHomeDone->GetValue();
value.ResetDone = m_ResetDone->GetValue();
value.ServoException = m_ServoException->GetValue();
value.Runable = m_Runable->GetValue();
value.ExceptionCode = m_ExceptionCode->GetValue();
value.Pos = m_Pos->GetValue();
value.Torque = m_Torque->GetValue();
value.ShowPos = m_ShowPos->GetValue();
value.RPos = m_RPos->GetValue();
value.SlaveServoBreakOn = m_ServoBreakOn->GetValue();
value.SlaveUnbind = m_Unbind->GetValue();
value.ServoBusy = m_ServoBusy->GetValue();
}
//void SlaveAxisState::Update(unsigned char* addr)
//{
// std::unique_lock<std::shared_mutex> lock(mtx);
// m_ServoOn= ((addr[0] & 0x1)>0 ? true : false);
// m_ServoHomeIndexOn= ((addr[0] & 0x2)>0 ? true : false);
// m_ServoReset= ((addr[0] & 0x4)>0 ? true : false);
// m_ServoBreakOn= ((addr[0] & 0x8)>0 ? true : false);
// m_Unbind= ((addr[0] & 0x10)>0 ? true : false);
// m_MoveP= ((addr[0] & 0x20)>0 ? true : false);
// m_MoveN= ((addr[0] & 0x40)>0 ? true : false);
// m_MovePContinue= ((addr[0] & 0x80)>0 ? true : false);
// m_MoveNContinue= ((addr[1] & 0x1)>0 ? true : false);
// m_MoveAbsPos= ((addr[1] & 0x2)>0 ? true : false);
// m_MotionStop= ((addr[1] & 0x4)>0 ? true : false);
// m_ServoRDY= ((addr[1] & 0x8)>0 ? true : false);
// m_ServoHomeDone= ((addr[1] & 0x10)>0 ? true : false);
// m_ResetDone= ((addr[1] & 0x20)>0 ? true : false);
// m_ServoBusy= ((addr[1] & 0x40)>0 ? true : false);
// m_ServoException= ((addr[1] & 0x80)>0 ? true : false);
// m_Runable= ((addr[2] & 0x1)>0 ? true : false);
// m_ExceptionCode = S7WORDDATA(addr[5], addr[4]).wValue;
//}