对连续32位 M变量,可以读取连续32bit M变量并转成实数(浮点数)存入D变量,或者将D变量数据(实数/浮点数)存储到连续32bit M变量
使用如下JBI和lua代码
-- author:chenliao@elibot.cn -- 20220729 NOP SET I000 528 //设置开始M变量地址 SET D002 -1987.087 //设置需要赋值的数据 DINT SET B000 2 //B000 =2,将D002 设置到从mstartbit开始的32bit TIMER T=1 S WAIT B000 = 0 SET I000 528 //设置开始M变量地址 SET B000 1 //B000 =1,从mstartbit开始的32bit数据转为浮点数,存储到D001中 TIMER T=1 S WAIT B000 = 0 END
function M32bitToReal(startbit) local mout = 0 local mbit = 0 for i = 32, 1, -1 do mbit = get_robot_io_status("M" .. (startbit + i - 1)) mout = mout | mbit mout = mout<<1 end mout = mout>>1 mout = string.pack("I", mout) return string.unpack("f", mout) end function RealToM32(data, startbit) local mout = 0 mout = string.pack("f", data) mout = string.unpack("I", mout) for i = 1, 32, 1 do if (mout & 1) > 0 then set_robot_io_status("M" .. (startbit+i-1), 1) else set_robot_io_status("M" .. (startbit+i-1), 0) end mout = mout >> 1 end end sleep(0.3) local startbit --I000存储开始bit local D001 -- 读取从M_startbit开始的32bit并转为REAL数据,存储到D001 local D002 -- 将D002数据(32bit REAL) 存储到M_startbit开始的32bit local B000 -- B000 =1 ,get data from m_startbit -- m_startbit_32 and transfer to REAL, set data to D001 -- B000 =2 ,get data from D002 , and store data in m_startbit -- m_startbit_32 while true do B000 = get_global_variable("B000") if (B000 == 1) then --Read M_startbit to M_startbit+32 and transfer to REAL --set result in D001 startbit = get_global_variable("I000") D001 = M32bitToReal(startbit) set_global_variable("D001", D001) set_global_variable("B000", 0) end if (B000 == 2) then --Set D002(32bit REAL) to M_startbit to M_startbit+32(ttl 32bit) startbit = get_global_variable("I000") D002 = get_global_variable("D002") RealToM32(D002, startbit) set_global_variable("B000", 0) end sleep(0.5) end