1'''
2Motion - Motion_3axishronous_move.py with synchronous mode.
3
4-------------------------------------------------------------------------------------
5Please change correct serial number or IP and port number BEFORE you run example code.
6
7For other examples please check:
8 https://github.com/WPC-Systems-Ltd/WPC_Python_driver_release/tree/main/examples
9See README.md file to get detailed usage of this example.
10
11Copyright (c) 2022-2025 WPC Systems Ltd. All rights reserved.
12'''
13
14## Python
15import threading
16import time
17
18## WPC
19from wpcsys import pywpc
20
21
22def Axis1_thread(handle, port, axis, delay=0.005):
23 move_status = 0
24 while move_status == 0:
25 move_status = handle.Motion_getMoveStatus(port, axis)
26 if move_status != 0:
27 print(f"Move completed axis {axis}...")
28 return move_status
29
30 ## Wait for seconds
31 time.sleep(delay) ## delay [sec]
32
33
34def Axis2_thread(handle, port, axis, delay=0.005):
35 move_status = 0
36 while move_status == 0:
37 move_status = handle.Motion_getMoveStatus(port, axis)
38 if move_status != 0:
39 print(f"Move completed axis {axis}...")
40 return move_status
41
42 ## Wait for seconds
43 time.sleep(delay) ## delay [sec]
44
45
46def Axis3_thread(handle, port, axis, delay=0.005):
47 move_status = 0
48 while move_status == 0:
49 move_status = handle.Motion_getMoveStatus(port, axis)
50 if move_status != 0:
51 print(f"Move completed axis {axis}...")
52 return move_status
53
54 ## Wait for seconds
55 time.sleep(delay) ## delay [sec]
56
57
58def main():
59 ## Get Python driver version
60 print(f'{pywpc.PKG_FULL_NAME} - Version {pywpc.__version__}')
61
62 ## Create device handle
63 dev = pywpc.EMotion()
64
65 ## Connect to device
66 try:
67 dev.connect("192.168.1.110") ## Depend on your device
68 except Exception as err:
69 pywpc.printGenericError(err)
70 ## Release device handle
71 dev.close()
72 return
73
74 try:
75 ## Parameters setting
76 port = 0 ## Depend on your device
77 axis1 = 0
78 axis2 = 1
79 axis3 = 2
80 two_pulse_mode = 1
81 rel_posi_mode = 1
82 stop_decel = 0
83 timeout = 3 ## [sec]
84
85 ## Axis and encoder parameters
86 axis_dir_cw = 0
87 encoder_dir_cw = 0
88
89 ## Polarity and enable parameters
90 active_low = 0
91 active_high = 1
92 forward_enable_false = 0
93 reverse_enable_false = 0
94
95 ## Define Axis1 ~ Axis3 thread
96 thread_1 = threading.Thread(target=Axis1_thread, args=[dev, port, axis1, 0.005])
97 thread_2 = threading.Thread(target=Axis2_thread, args=[dev, port, axis2, 0.005])
98 thread_3 = threading.Thread(target=Axis3_thread, args=[dev, port, axis3, 0.005])
99
100 ## Thread start
101 thread_1.start()
102 thread_2.start()
103 thread_3.start()
104
105 ## Get firmware model & version
106 driver_info = dev.Sys_getDriverInfo(timeout)
107 print(f"Model name: {driver_info[0]}, Firmware version: {driver_info[-1]} ")
108
109 ## Motion open
110 err = dev.Motion_open(port, timeout)
111 print(f"Motion_open in port {port}, status: {err}")
112
113
114 '''
115 ## Motion open configuration file
116 err = dev.Motion_openCfgFile('C:/Users/user/Desktop/3AxisStage_2P.ini')
117 print(f"openCfgFile, status: {err}")
118
119 ## Motion load configuration file
120 err = dev.Motion_loadCfgFile()
121 print(f"loadCfgFile, status: {err}")
122 '''
123
124 ## Motion configure for axis1
125 err = dev.Motion_cfgAxis(port, axis1, two_pulse_mode, axis_dir_cw, encoder_dir_cw, active_low, timeout)
126 print(f"Motion_cfgAxis in axis{axis1}, status: {err}")
127
128 err = dev.Motion_cfgLimit(port, axis1, forward_enable_false, reverse_enable_false, active_low, timeout)
129 print(f"Motion_cfgLimit in axis{axis1}, status: {err}")
130
131 err = dev.Motion_rstEncoderPosi(port, axis1, encoder_posi=0, timeout=timeout)
132 print(f"Motion_rstEncoderPosi in axis{axis1}, status: {err}")
133
134 err = dev.Motion_cfgAxisMove(port, axis1, rel_posi_mode, target_posi=1000, velo=10000, accel=100000, decel=100000, timeout=timeout)
135 print(f"Motion_cfgAxisMove in axis{axis1}, status: {err}")
136
137 err = dev.Motion_enableServoOn(port, axis1, timeout)
138 print(f"Motion_enableServoOn in axis{axis1}, status: {err}")
139
140 ## Motion start for axis1
141 err = dev.Motion_startSingleAxisMove(port, axis1, timeout)
142 print(f"Motion_startSingleAxisMove in axis{axis1}, status: {err}")
143
144 ## Motion configure for axis2
145 err = dev.Motion_cfgAxis(port, axis2, two_pulse_mode, axis_dir_cw, encoder_dir_cw, active_low, timeout)
146 print(f"Motion_cfgAxis in axis{axis2}, status: {err}")
147
148 err = dev.Motion_cfgLimit(port, axis2, forward_enable_false, reverse_enable_false, active_low, timeout)
149 print(f"Motion_cfgLimit in axis{axis2}, status: {err}")
150
151 err = dev.Motion_rstEncoderPosi(port, axis2, encoder_posi=0, timeout=timeout)
152 print(f"Motion_rstEncoderPosi in axis{axis2}, status: {err}")
153
154 err = dev.Motion_cfgAxisMove(port, axis2, rel_posi_mode, target_posi=1000, velo=10000, accel=100000, decel=100000, timeout=timeout)
155 print(f"Motion_cfgAxisMove in axis{axis2}, status: {err}")
156
157 err = dev.Motion_enableServoOn(port, axis2, timeout)
158 print(f"Motion_enableServoOn in axis{axis2}, status: {err}")
159
160 ## Motion start for axis2
161 err = dev.Motion_startSingleAxisMove(port, axis2, timeout)
162 print(f"Motion_startSingleAxisMove in axis{axis2}, status: {err}")
163
164 ## Motion configure for axis3
165 err = dev.Motion_cfgAxis(port, axis3, two_pulse_mode, axis_dir_cw, encoder_dir_cw, active_low, timeout)
166 print(f"Motion_cfgAxis in axis{axis3}, status: {err}")
167
168 err = dev.Motion_cfgLimit(port, axis3, forward_enable_false, reverse_enable_false, active_low, timeout)
169 print(f"Motion_cfgLimit in axis{axis3}, status: {err}")
170
171 err = dev.Motion_rstEncoderPosi(port, axis3, encoder_posi=0, timeout=timeout)
172 print(f"Motion_rstEncoderPosi in axis{axis3}, status: {err}")
173
174 err = dev.Motion_cfgAxisMove(port, axis3, rel_posi_mode, target_posi=-5000, velo=10000, accel=100000, decel=100000, timeout=timeout)
175 print(f"Motion_cfgAxisMove in axis{axis3}, status: {err}")
176
177 err = dev.Motion_enableServoOn(port, axis3, timeout)
178 print(f"Motion_enableServoOn in axis{axis3}, status: {err}")
179
180 ## Motion start for axis3
181 err = dev.Motion_startSingleAxisMove(port, axis3, timeout)
182 print(f"Motion_startSingleAxisMove in axis{axis3}, status: {err}")
183
184 ## Wait for thread completion
185 thread_1.join()
186 print("Axis1_Thread returned.")
187
188 thread_2.join()
189 print("Axis2_Thread returned.")
190
191 thread_3.join()
192 print("Axis3_Thread returned.")
193
194 for i in [axis1, axis2, axis3]:
195 err = dev.Motion_enableServoOff(port, i, timeout)
196 print(f"Motion_enableServoOff in axis{i}, status: {err}")
197
198 ## Motion stop
199 for i in [axis1, axis2, axis3]:
200 err = dev.Motion_stop(port, i, stop_decel, timeout)
201 print(f"Motion_stop in axis{i}, status: {err}")
202
203 ## Motion close
204 err = dev.Motion_close(port, timeout)
205 print(f"Motion_close in port {port}, status: {err}")
206 except Exception as err:
207 pywpc.printGenericError(err)
208
209 finally:
210 ## Disconnect device
211 dev.disconnect()
212
213 ## Release device handle
214 dev.close()
215
216
217if __name__ == '__main__':
218 main()