Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
ACSingleStore
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 8aa8a5fe
由
LN
编写于
2021-03-02 11:34:40 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
伺服更新为新版本
1 个父辈
3e48b24a
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
124 行增加
和
64 行删除
source/Common/util/AcSerialBean.cs
source/DeviceLibrary/PanasonicServo/ACCMDManager.cs
source/DeviceLibrary/PanasonicServo/ACServerManager.cs
source/DeviceLibrary/PanasonicServo/ACServerManager_Partial.cs
source/Common/util/AcSerialBean.cs
查看文件 @
8aa8a5f
...
...
@@ -288,7 +288,7 @@ namespace OnlineStore.Common
if
(
_serialPort
.
IsOpen
)
{
//lock (lockObj)
if
(
Monitor
.
TryEnter
(
lockObj
,
1
0
))
if
(
Monitor
.
TryEnter
(
lockObj
,
Overtime
+
5
0
))
{
//Monitor.Enter(lockObj);
try
...
...
@@ -339,7 +339,7 @@ namespace OnlineStore.Common
return
-
1
;
}
private
byte
PreSlvAddr
=
0
;
/// <summary>
/// 发送命令
/// </summary>
...
...
@@ -358,10 +358,22 @@ namespace OnlineStore.Common
if
(
_serialPort
.
IsOpen
)
{
if
(
Monitor
.
TryEnter
(
lockObj
,
20
0
))
if
(
Monitor
.
TryEnter
(
lockObj
,
Overtime
+
8
0
))
{
//Monitor.Enter(lockObj);
try
{
//判断是否需要休眠
if
(
SendData
!=
null
&&
SendData
.
Length
>
0
)
{
if
(!
SendData
[
0
].
Equals
(
PreSlvAddr
))
{
Thread
.
Sleep
(
50
);
PreSlvAddr
=
SendData
[
0
];
}
}
_serialPort
.
DiscardInBuffer
();
//清空接收缓冲区
_serialPort
.
Write
(
SendData
,
0
,
SendData
.
Length
);
int
num
=
0
,
ret
=
0
;
...
...
@@ -372,7 +384,7 @@ namespace OnlineStore.Common
}
while
(
num
++
<
Overtime
)
{
if
(
_serialPort
.
BytesToRead
>=
ReceiveLength
)
if
(
_serialPort
.
BytesToRead
>=
Receive
Data
.
Length
)
break
;
System
.
Threading
.
Thread
.
Sleep
(
1
);
}
...
...
@@ -380,10 +392,10 @@ namespace OnlineStore.Common
{
LogUtil
.
error
(
PortName
+
" 发送数据"
+
ByteToString
(
SendData
)
+
"等待接受数据超时"
);
}
if
(
_serialPort
.
BytesToRead
>=
ReceiveLength
)
if
(
_serialPort
.
BytesToRead
>=
Receive
Data
.
Length
)
{
ret
=
_serialPort
.
Read
(
ReceiveData
,
0
,
ReceiveLength
);
ret
=
_serialPort
.
Read
(
ReceiveData
,
0
,
Receive
Data
.
Length
);
}
else
{
...
...
source/DeviceLibrary/PanasonicServo/ACCMDManager.cs
查看文件 @
8aa8a5f
...
...
@@ -8,11 +8,14 @@ namespace OnlineStore.DeviceLibrary
public
class
ACCMDManager
{
/// <summary>
/// 0130h 选通输入(STB) 状态 ReadOnly 0: 输入 OFF 1: 输入 ON
/// </summary>
internal
static
string
STB_State
=
"0130"
;
/// <summary>
/// 0132h 原点接近传感器输入 (HOME) 状态 ReadOnly 0: 输入 OFF 1: 输入 ON
/// </summary>
public
static
string
Home_Single
=
"0132"
;
//
//
/// <summary>
/// 0022h 负方向驱动禁止输入(NOT) ReadOnly 0: 输入 OFF、 1: 输入 ON
/// </summary>
...
...
source/DeviceLibrary/PanasonicServo/ACServerManager.cs
查看文件 @
8aa8a5f
...
...
@@ -19,7 +19,7 @@ namespace OnlineStore.DeviceLibrary
private
static
int
ReviceOutTimeMS
=
100
;
private
static
Dictionary
<
string
,
Dictionary
<
string
,
int
>>
ComAddrValue
=
new
Dictionary
<
string
,
Dictionary
<
string
,
int
>>();
private
static
string
mapObj
=
""
;
private
static
int
GetAddrValue
(
string
portName
,
int
slvAddr
,
string
addr
)
{
int
value
=
-
1
;
...
...
@@ -74,12 +74,6 @@ namespace OnlineStore.DeviceLibrary
}
}
public
static
void
ClearSpeed
()
{
LogUtil
.
info
(
"清理之前设置保存的速度列表"
);
ComAddrValue
=
new
Dictionary
<
string
,
Dictionary
<
string
,
int
>>();
}
public
static
bool
OpenPort
(
string
portName
)
{
if
(
serialBeanMap
.
ContainsKey
(
portName
))
...
...
@@ -162,7 +156,8 @@ namespace OnlineStore.DeviceLibrary
public
static
bool
IsHomeMoveEnd
(
string
portName
,
int
slvAddr
)
{
int
status
=
GetHomeEndStatus
(
portName
,
slvAddr
);
if
(
status
>=
1
)
bool
isOk
=
ACServerManager
.
GetBusyStatus
(
portName
,
slvAddr
).
Equals
(
0
);
if
(
status
>=
1
&&
isOk
)
{
return
true
;
}
return
false
;
...
...
@@ -183,33 +178,33 @@ namespace OnlineStore.DeviceLibrary
{
LogUtil
.
info
(
"开始初始化伺服【"
+
portName
+
"】【"
+
slvAddr
+
"】"
);
//写入block
int
sleep
=
2
0
;
int
sleep
=
5
0
;
string
slvAddrStr
=
string
.
Format
(
strFromat
,
slvAddr
);
//block0=原点返回,正方向
string
str0
=
slvAddrStr
+
"104800 000408 00000420 00000000 ffff"
;
SendStrAndSleep
(
portName
,
str0
,
sleep
);
//block1=原点返回,反方向
string
str1
=
slvAddrStr
+
"104804 000408 04000420 00000000 ffff"
;
SendStrAndSleep
(
portName
,
str1
,
sleep
);
//block2=绝对位置运动
string
str2
=
slvAddrStr
+
"104808 000408 10000211EC78FFFF ffff"
;
SendStrAndSleep
(
portName
,
str2
,
sleep
);
//block3=相对位置运动
string
str3
=
slvAddrStr
+
"10480C 000408 10000111EC78FFFF ffff"
;
SendStrAndSleep
(
portName
,
str3
,
sleep
);
//block4=正方向匀速运动
string
str4
=
slvAddrStr
+
"104810 000408 10000311 00000000 ffff"
;
SendStrAndSleep
(
portName
,
str4
,
sleep
);
//block5=反方向匀速运动
string
str5
=
slvAddrStr
+
"104814 000408 14000311 00000000 ffff"
;
SendStrAndSleep
(
portName
,
str5
,
sleep
);
//block6=减速停止
string
str6
=
slvAddrStr
+
"104818 000408 00000500 00000000 ffff"
;
SendStrAndSleep
(
portName
,
str6
,
sleep
);
//
//
block0=原点返回,正方向
//
string str0 = slvAddrStr + "104800 000408 00000420 00000000 ffff";
//SendStrAndSleep(portName, str0, sleep);
//
//
block1=原点返回,反方向
//
string str1 = slvAddrStr + "104804 000408 04000420 00000000 ffff";
//SendStrAndSleep(portName, str1, sleep);
//
//
block2=绝对位置运动
//
string str2 = slvAddrStr + "104808 000408 10000211EC78FFFF ffff";
//
SendStrAndSleep(portName, str2, sleep);
//
//
block3=相对位置运动
//
string str3 = slvAddrStr + "10480C 000408 10000111EC78FFFF ffff";
//
SendStrAndSleep(portName, str3, sleep);
//
//
block4=正方向匀速运动
//
string str4 = slvAddrStr + "104810 000408 10000311 00000000 ffff";
//
SendStrAndSleep(portName, str4, sleep);
//
//
block5=反方向匀速运动
//
string str5 = slvAddrStr + "104814 000408 14000311 00000000 ffff";
//
SendStrAndSleep(portName, str5, sleep);
//
//
block6=减速停止
//
string str6 = slvAddrStr + "104818 000408 00000500 00000000 ffff";
//
SendStrAndSleep(portName, str6, sleep);
//block7=紧急停止
string
str7
=
slvAddrStr
+
"10481c 000408 00000510 00000000 ffff"
;
SendStrAndSleep
(
portName
,
str7
,
sleep
);
//
//
block7=紧急停止
//
string str7 = slvAddrStr + "10481c 000408 00000510 00000000 ffff";
//
SendStrAndSleep(portName, str7, sleep);
//0106460001009D12
//速度 V1 =100
...
...
@@ -323,8 +318,8 @@ namespace OnlineStore.DeviceLibrary
int
isHomeEnd
=
GetHomeEndStatus
(
portName
,
slvAddr
);
if
(
isHomeEnd
.
Equals
(
1
))
{
int
value
=
2000
;
LogUtil
.
info
(
"轴【"
+
portName
+
"_"
+
slvAddr
+
"】原点返回时发现原点已亮且回过原点,需要先相对走"
+
value
);
int
value
=
2000
;
LogUtil
.
info
(
"轴【"
+
portName
+
"_"
+
slvAddr
+
"】原点返回时发现原点已亮且回过原点,需要先相对走"
+
value
);
RelMove
(
portName
,
slvAddr
,
value
);
bool
isStop
=
false
;
for
(
int
i
=
0
;
i
<=
10
;
i
++)
...
...
@@ -345,10 +340,10 @@ namespace OnlineStore.DeviceLibrary
}
else
{
int
volSpeed
=
Math
.
Abs
(
speed
/
5
);
int
volSpeed
=
Math
.
Abs
(
speed
/
5
);
int
time
=
1500
;
LogUtil
.
info
(
"轴【"
+
portName
+
"_"
+
slvAddr
+
"】原点返回时发现原点已亮但未回过原点,先匀速向上走"
+
time
+
",速度["
+
volSpeed
+
"]"
);
LogUtil
.
info
(
"轴【"
+
portName
+
"_"
+
slvAddr
+
"】原点返回时发现原点已亮但未回过原点,先匀速向上走"
+
time
+
",速度["
+
volSpeed
+
"]"
);
//需要匀速向上走
ACServerManager
.
SpeedMove
(
portName
,
slvAddr
,
volSpeed
);
Thread
.
Sleep
(
time
);
...
...
@@ -357,7 +352,8 @@ namespace OnlineStore.DeviceLibrary
Thread
.
Sleep
(
100
);
}
}
}
catch
(
Exception
ex
)
}
catch
(
Exception
ex
)
{
LogUtil
.
error
(
"轴【"
+
portName
+
"_"
+
slvAddr
+
"】原点返回前验证是否在原点出错:"
+
ex
.
StackTrace
);
}
...
...
@@ -368,8 +364,9 @@ namespace OnlineStore.DeviceLibrary
}
public
static
void
SetSpeed
(
string
portName
,
int
slvAddr
,
int
speed
)
{
speed
=
Math
.
Abs
(
speed
);
int
preSpeed
=
GetAddrValue
(
portName
,
slvAddr
,
ACCMDManager
.
Speed_Addr
);
if
((
preSpeed
.
Equals
(-
1
))
||
(!
preSpeed
.
Equals
(
Math
.
Abs
(
speed
)
)))
if
((
preSpeed
.
Equals
(-
1
))
||
(!
preSpeed
.
Equals
(
speed
)))
{
string
v1
=
slvAddr
+
"064601 "
+
ACServerManager
.
SpeedToStr
(
speed
,
4
)
+
" ffff"
;
LogUtil
.
debug
(
"轴【"
+
portName
+
"_"
+
slvAddr
+
"】更新速度为【"
+
speed
+
"】,发送数据【"
+
v1
+
"】"
);
...
...
@@ -386,8 +383,8 @@ namespace OnlineStore.DeviceLibrary
LogUtil
.
error
(
"轴【"
+
portName
+
"_"
+
slvAddr
+
"】更新速度为【"
+
speed
+
"】,发送数据【"
+
v1
+
"】,第【"
+
i
+
"】次失败"
);
Thread
.
Sleep
(
SleepMSendons
);
}
}
UpdateAddrValue
(
portName
,
slvAddr
,
ACCMDManager
.
Speed_Addr
,
Math
.
Abs
(
speed
)
);
}
UpdateAddrValue
(
portName
,
slvAddr
,
ACCMDManager
.
Speed_Addr
,
speed
);
Thread
.
Sleep
(
SleepMSendons
);
}
}
...
...
source/DeviceLibrary/PanasonicServo/ACServerManager_Partial.cs
查看文件 @
8aa8a5f
...
...
@@ -37,7 +37,7 @@ namespace OnlineStore.DeviceLibrary
bool
result
=
SendData
(
portName
,
data
);
System
.
Threading
.
Thread
.
Sleep
(
sleepS
);
return
result
;
}
}
public
static
void
SaveData
(
string
portName
,
byte
slvAddr
,
string
regAddr
,
int
value
)
{
...
...
@@ -152,9 +152,10 @@ namespace OnlineStore.DeviceLibrary
else
{
int
ret
=
bean
.
SendCommand
(
data
,
ref
returnData
,
outTime
,
reviceLength
);
string
rDataStr
=
AcSerialBean
.
ByteToString
(
returnData
);
if
(!
ret
.
Equals
(
reviceLength
))
{
LogUtil
.
error
(
"串口"
+
portName
+
" 写入数据:"
+
strSend
+
",预计返回字节数【"
+
reviceLength
+
"】实际返回【"
+
ret
+
"】"
);
LogUtil
.
error
(
"串口"
+
portName
+
" 写入数据:"
+
strSend
+
",预计返回字节数【"
+
reviceLength
+
"】实际返回【"
+
ret
+
"】
【"
+
rDataStr
+
"】
"
);
}
System
.
Threading
.
Thread
.
Sleep
(
2
);
}
...
...
@@ -172,7 +173,7 @@ namespace OnlineStore.DeviceLibrary
/// <param name="outTime">超时时间</param>
/// <param name="result">返回结果,是否发送成功</param>
/// <returns>返回值的长度</returns>
public
static
byte
[]
SendCommand
(
string
portName
,
byte
[]
data
,
int
outTime
,
int
reviceLength
,
out
bool
result
)
public
static
byte
[]
SendCommand
(
string
portName
,
byte
[]
data
,
int
outTime
,
int
reviceLength
,
out
bool
result
)
{
if
(
outTime
<
100
)
{
...
...
@@ -209,10 +210,12 @@ namespace OnlineStore.DeviceLibrary
int
ret
=
bean
.
SendCommand
(
data
,
ref
returnData
,
outTime
,
reviceLength
);
if
(!
ret
.
Equals
(
reviceLength
))
{
LogUtil
.
error
(
"串口"
+
portName
+
" 写入数据:"
+
strSend
+
",预计返回字节数【"
+
reviceLength
+
"】实际返回【"
+
ret
+
"】"
);
}
else
string
datastr
=
AcSerialBean
.
ByteToString
(
returnData
);
LogUtil
.
error
(
"串口"
+
portName
+
" 写入数据:"
+
strSend
+
",预计返回字节数【"
+
reviceLength
+
"】实际返回【"
+
ret
+
"】:"
+
datastr
);
}
else
{
result
=
true
;
result
=
true
;
}
System
.
Threading
.
Thread
.
Sleep
(
2
);
}
...
...
@@ -270,15 +273,46 @@ namespace OnlineStore.DeviceLibrary
int
length
=
2
;
byte
[]
dataArray
=
ACCMDManager
.
GetWriteData
(
slvAddr
,
ACCMDManager
.
CMD_WriteCoil
,
addr
,
data
,
length
);
SendData
(
portName
,
dataArray
);
System
.
Threading
.
Thread
.
Sleep
(
500
);
data
=
"0000"
;
dataArray
=
ACCMDManager
.
GetWriteData
(
slvAddr
,
ACCMDManager
.
CMD_WriteCoil
,
addr
,
data
,
length
);
SendData
(
portName
,
dataArray
);
}
for
(
int
i
=
1
;
i
<=
3
;
i
++)
{
bool
result
=
SendData
(
portName
,
dataArray
);
if
(
result
)
{
System
.
Threading
.
Thread
.
Sleep
(
500
);
data
=
"0000"
;
dataArray
=
ACCMDManager
.
GetWriteData
(
slvAddr
,
ACCMDManager
.
CMD_WriteCoil
,
addr
,
data
,
length
);
result
=
SendData
(
portName
,
dataArray
);
break
;
}
else
{
LogUtil
.
error
(
"【"
+
portName
+
"_"
+
slvAddr
+
"】 , 第"
+
i
+
"次,SuddenStop 发送数据失败"
);
Thread
.
Sleep
(
180
);
}
}
}
public
static
void
OpenAndCloseSTB
(
string
portName
,
int
slvAddr
)
{
if
(
GetBusyStatus
(
portName
,
slvAddr
).
Equals
(
1
))
{
LogUtil
.
error
(
"伺服【"
+
portName
+
"_"
+
slvAddr
+
"】OpenSTB时发现 busy=1,直接返回"
);
return
;
}
System
.
Threading
.
Thread
.
Sleep
(
SleepMSendons
);
if
(
GetSTBState
(
portName
,
slvAddr
).
Equals
(
1
))
{
LogUtil
.
error
(
"伺服【"
+
portName
+
"_"
+
slvAddr
+
"】OpenSTB时发现 STB=ON,先关闭STB"
);
CloseSTB
(
portName
,
slvAddr
);
System
.
Threading
.
Thread
.
Sleep
(
SleepMSendons
);
if
(
GetSTBState
(
portName
,
slvAddr
).
Equals
(
1
))
{
LogUtil
.
error
(
"伺服【"
+
portName
+
"_"
+
slvAddr
+
"】OpenSTB时发现 STB=ON,先关闭STB 后发现STB仍为ON,直接返回"
);
return
;
}
}
OnlyOpenSTB
(
portName
,
slvAddr
);
System
.
Threading
.
Thread
.
Sleep
(
200
);
CloseSTB
(
portName
,
slvAddr
);
...
...
@@ -382,7 +416,7 @@ namespace OnlineStore.DeviceLibrary
{
return
GetActualtPosition
(
axis
.
DeviceName
,
axis
.
GetAxisValue
());
}
public
static
int
GetActualtPosition
(
string
portName
,
int
slvAddr
)
public
static
int
GetActualtPosition
(
string
portName
,
int
slvAddr
,
int
rGetCount
=
3
)
{
PreReadAddr
=
ACCMDManager
.
ActualPosition
;
byte
[]
dataArray
=
ACCMDManager
.
GetWriteData
(
slvAddr
,
ACCMDManager
.
CMD_ReadRegisters
,
ACCMDManager
.
ActualPosition
,
"0000"
,
2
);
...
...
@@ -390,7 +424,7 @@ namespace OnlineStore.DeviceLibrary
byte
[]
reviceData
=
SendCommand
(
portName
,
dataArray
,
ReviceOutTimeMS
,
9
);
int
result
=
-
1
;
for
(
int
i
=
1
;
i
<=
3
;
i
++)
for
(
int
i
=
1
;
i
<=
rGetCount
;
i
++)
{
result
=
GetRegisterData
(
portName
,
reviceData
,
ACCMDManager
.
ActualPosition
);
if
(!
result
.
Equals
(-
1
))
...
...
@@ -401,6 +435,7 @@ namespace OnlineStore.DeviceLibrary
{
LogUtil
.
error
(
"第"
+
i
+
"次获取"
+
portName
+
"_"
+
slvAddr
+
"的实时位置"
+
result
);
}
Thread
.
Sleep
(
180
);
}
return
result
;
}
...
...
@@ -469,6 +504,19 @@ namespace OnlineStore.DeviceLibrary
return
GetCoilData
(
portName
,
reviceData
,
ACCMDManager
.
Home_Single
);
}
/// <summary>
/// 获取STB信号值,1=On,0=OFF
/// </summary>
/// <param name="portName"></param>
/// <param name="slvAddr"></param>
/// <returns></returns>
public
static
int
GetSTBState
(
string
portName
,
int
slvAddr
)
{
PreReadCoilAddr
=
ACCMDManager
.
STB_State
;
byte
[]
dataArray
=
ACCMDManager
.
GetWriteData
(
slvAddr
,
ACCMDManager
.
CMD_ReadCoil
,
ACCMDManager
.
STB_State
,
"0000"
,
1
);
byte
[]
reviceData
=
SendCommand
(
portName
,
dataArray
,
ReviceOutTimeMS
,
6
);
return
GetCoilData
(
portName
,
reviceData
,
ACCMDManager
.
STB_State
);
}
/// <summary>
/// 负极限
/// </summary>
public
static
int
GetLimitNegativeSingle
(
string
portName
,
int
slvAddr
)
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论