This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,
我想发送etherCAT上的32位数据类型。
为了对其进行测试,我创建了一个包含3个变量的SSC应用程序,并 使用CM示例创建了CCS项目:
在我的objects.h中一切看起来都很好我可以看到我定义的变量:
以及TwinCAT:
现在,我 不确定实施输入映射的最佳方式是什么。
我一直在使用uint16,所以我只是增加指针,因为pData是UINT16*:
void APPL_InputMapping(UINT16* pData) { #if _WIN32 #pragma message ("Warning: Implement input (Slave->Master) mapping") #else #warning "Implement input (Slave->Master) mapping" #endif *pData = Myvar0x6000.Var1; pData++; *pData = Myvar0x6000.Var2; pData++; *pData = Myvar0x6000.Var3; }
但是现在我使用的是real32和UINT32,我不确定如何实现它。 我只是尝试移动指针两次 以获得32位,但它不起作用。
void APPL_InputMapping(UINT16* pData) { *pData = DataTest0x6000.FloatingVariable; pData++; pData++; *pData = DataTest0x6000.Integer32Var_1; pData++; pData++; *pData = DataTest0x6000.Integer32Var_2; }
如果您有使用uint16以外的其他数据类型的示例,请告诉我。
谢谢你
您好,
设备专家不在办公室,直至21日星期四。 请在本周结束前回复。
此致
Lori
您好,Alexis,
I2000 floate-datatype-PDO-on-EtherCAT"]I一直2000一直在109.4436万在使用2.8388万使用uint16,所以我只是在增加一个指针[/INT16*:UINT16案例中递增+1是否有效? CM内核是可字节寻址的,所以我认为你实际上必须增加两倍。
有关CM示例中的UINT8,UINT16和UINT32数据处理,请参阅下面的代码片段。
Fullscreen123456789101112131415161718192021UINT8 *pTmpData = (UINT8 *)pData;switch(sTxPDOassign.aEntries[j]){//// TxPDO 0 (Data from ESC to master)//case 0x1A00U://// Switches (8-bit (Byte) Data)//data = ((Switches0x6000.Switch8 << 7U) |(Switches0x6000.Switch7 << 6U) |(Switches0x6000.Switch6 << 5U) |(Switches0x6000.Switch5 << 4U) |(Switches0x6000.Switch4 << 3U) |(Switches0x6000.Switch3 << 2U) |(Switches0x6000.Switch2 << 1U) |Switches0x6000.Switch1);*(volatile UINT8 *)pTmpData = data;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUINT8 *pTmpData = (UINT8 *)pData; switch(sTxPDOassign.aEntries[j]) { // // TxPDO 0 (Data from ESC to master) // case 0x1A00U: // // Switches (8-bit (Byte) Data) // data = ((Switches0x6000.Switch8 << 7U) | (Switches0x6000.Switch7 << 6U) | (Switches0x6000.Switch6 << 5U) | (Switches0x6000.Switch5 << 4U) | (Switches0x6000.Switch4 << 3U) | (Switches0x6000.Switch3 << 2U) | (Switches0x6000.Switch2 << 1U) | Switches0x6000.Switch1); *(volatile UINT8 *)pTmpData = data; pTmpData++; break; // // TxPDO 1 (Data from ESC to master) // case 0x1A01U: // // DataToMaster (32 bits Data) // *(volatile UINT32 *)pTmpData = DataToMaster0x6010.DataToMaster; pTmpData += 4U; // // ModeResponse (16 bits Data) // *(volatile UINT16 *)pTmpData = TargetModeResponse0x6012.ModeResponse; pTmpData += 2U; // // SpeedPosFbk (32 bits Data) // *(volatile UINT32 *)pTmpData = TargetSpeedPosFeedback0x6014.SpeedPosFbk; break; }最佳,
Kevin
编辑:由于pData是UINT16*,因此您拥有的可能是OK的。 这可能是仍然需要的排种。
您好,Kevin:
我从未想过CM是与C2000不同的架构。 对于 UINT16,增加+1是很有效的(我建议你在自己的端尝试)。
对于32位,我们使用temp 32指针,它可以执行以下任务:
void APPL_InputMapping(UINT16* pData)
{
UINT32 *tempdata =(UINT32*) pData;
*tempdata = MyData0x6000.VAR1;
*tempdata ++;
*tempdata = MyData0x6000.VA2;
}
我将看看这个示例,但我仍然很好奇为什么在生成文件的过程中它不会生成输入和输出映射。 我的意思是,PDO在Excel工作表中已知。