Folks,
Tonia Batten is having a very strange problem that I cannot understand, perhaps someone on tech-talk has an idea.
She is using the Newport XPS motor driver. It works fine when it is run on an Intel machine. However, when it is run on an armv5teb she is seeing a behavior I cannot understand. This happens both with the older model 2 XPS driver (C code), as well as the newer model 3 driver (C++).
The asyn device support defines the following message structure:
typedef struct {
motorCommand command;
interfaceType interface;
int ivalue;
double dvalue;
} motorAsynMessage;
In the code that is called from the motor record it does the following:
/* Make a copy of asynUser. This is needed because we can have multiple
* requests queued. It will be freed in the callback */
pasynUser = pasynManager->duplicateAsynUser(pasynUser, asynCallback, 0);
pmsg = pasynManager->memMalloc(sizeof *pmsg);
pmsg->ivalue=0;
pmsg->dvalue=0.;
pmsg->interface = float64Type;
pasynUser->userData = pmsg;
switch (command) {
...
case SET_VELOCITY:
pmsg->command = motorVelocity;
pmsg->dvalue = *param;
break;
...
/* Queue asyn request, so we get a callback when driver is ready */
pasynUser->reason = pPvt->driverReasons[pmsg->command];
status = pasynManager->queueRequest(pasynUser, 0, 0);
So in the case of the SET_VELOCITY it copies the desired velocity to pmsg->dvalue. It calls pasynManager->queueRequest to call back device support when the driver is ready.
This is the start of the code in the device support callback function:
static void asynCallback(asynUser *pasynUser)
{
motorAsynPvt *pPvt = (motorAsynPvt *)pasynUser->userPvt;
motorRecord *pmr = pPvt->pmr;
motorAsynMessage *pmsg = pasynUser->userData;
int status;
int commandIsMove = 0;
pasynUser->reason = pPvt->driverReasons[pmsg->command];
Tonia has added some debugging to the device support code. When the velocity is being set, for example the code called by the motor record prints the following:
2014/05/02 10:10:56.266 devMotorAsyn::send_msg: SMTR1608-9-B20-05:brag command=7, pact=1, value=45000.000000
devAsynMotor::build_trans, calling queueRequest, pmsg=0x60b3cc, command=7, interface=1, dvalue=45000.000046
This is fine, the value 45000. has been copied to pmsg->dvalue
However, when pasynManager does the callback to device support from the queueRequest she sees the following:
devAsynMotor::asynCallback, entry, pmsg=0x60b3cc, command=7, interface=1, dvalue=0.000000
2014/05/02 10:10:56.308 devMotorAsyn::asynCallback: SMTR1608-9-B20-05:brag command=7, ivalue=0, dvalue=0.000000, pasynUser->reason=7
2014/05/02 10:10:56.310 asynMotorController:writeFloat64:: axis=0, function=7, value=0.000000
Note that pmsg has the same address (=0x60b3cc,), so it is getting a pointer to the same address as before the queueRequest.
However, pmsg->dvalue is now 0, rather than 45000.
Any idea how this could happen?
Thanks,
Mark
________________________________
From: Tonia Batten [[email protected]]
Sent: Friday, May 02, 2014 12:18 PM
To: Mark Rivers
Subject: RE: Newport XPS-Q8 and Motor Record - armv5teb architecture
Hi Mark,
I am experiencing the same problem using the model 3 XPS driver. I have included details from my testing below. I can’t see anything in asyn-4-22/asyn/asynDriver/asynManager.c queueRequest function that would cause this. Any insight you can provide is appreciated.
Regards, Tonia
Here is my st.cmd file.
#!./bin/linux-armv5teb/ideasMonoMtr
## You may have to change ideasMonoMtr to something else
## everywhere it appears in this file
#< envPaths
## Register all support components
dbLoadDatabase("./dbd/ideasMonoMtr.dbd",0,0)
ideasMonoMtr_registerRecordDeviceDriver(pdbbase)
## Load record instances
dbLoadRecords("./db/IDEAS_MonoMtr.db")
dbLoadRecords("./db/IDEAS_MonoPseudoMtr.db")
dbLoadRecords("$(MOTOR)/db/motorUtil.db", "P=SMTR1608-9-B20-05:")
# asyn port, IP address, IP port, number of axes,
# active poll period (ms), idle poll period (ms),
# enable set position, set position settling time (ms)
XPSCreateController("XPS1", "192.168.0.254", 5001, 1, 10, 5000, 0, 5000)
# asynPort, IP address, IP port, poll period (ms)
XPSAuxConfig("XPS_AUX1", "192.168.0.254", 5001, 500)
# XPS asyn port, axis, groupName.positionerName, stepSize
XPSCreateAxis("XPS1",0,"S.Pos","10000")
asynSetTraceMask("XPS1",0,0xFF)
asynSetTraceIOMask("XPS1",0,0x2)
# XPS asyn port, max points, FTP username, FTP password
# Note: this must be done after configuring axes
XPSCreateProfile("XPS1", 2000, "Administrator", "Administrator")
iocInit
Here is the asyn Trace information when I try and move the motor.
2014/05/02 10:10:56.253 SMTR1608-9-B20-05:brag devMotorAsyn::update_values, needUpdate=0
2014/05/02 10:10:56.257 devMotorAsyn::send_msg: SMTR1608-9-B20-05:brag command=5, pact=1, value=1000.000000
devAsynMotor::build_trans, calling queueRequest, pmsg=0x597bd4, command=6, interface=1, dvalue=1000.000001
2014/05/02 10:10:56.260 XPS1 addr 0 queueRequest priority 0 not lockHolder
2014/05/02 10:10:56.262 devMotorAsyn::send_msg: SMTR1608-9-B20-05:brag command=6, pact=1, value=10000.000000
devAsynMotor::build_trans, calling queueRequest, pmsg=0x60b224, command=5, interface=1, dvalue=10000.000012
2014/05/02 10:10:56.266 XPS1 addr 0 queueRequest priority 0 not lockHolder
2014/05/02 10:10:56.266 devMotorAsyn::send_msg: SMTR1608-9-B20-05:brag command=7, pact=1, value=45000.000000
devAsynMotor::build_trans, calling queueRequest, pmsg=0x60b3cc, command=7, interface=1, dvalue=45000.000046
2014/05/02 10:10:56.267 XPS1 addr 0 queueRequest priority 0 not lockHolder
2014/05/02 10:10:56.268 devMotorAsyn::send_msg: SMTR1608-9-B20-05:brag command=0, pact=1, value=246415.275059
2014/05/02 10:10:56.268 devMotorAsyn::send_msg: SMTR1608-9-B20-05:brag command=8, pact=1, value=0.000000
devAsynMotor::build_trans, calling queueRequest, pmsg=0x60b574, command=0, interface=1, dvalue=0.000000
2014/05/02 10:10:56.269 XPS1 addr 0 queueRequest priority 0 not lockHolder
2014/05/02 10:10:56.272 asynManager::portThread port=XPS1 callback
devAsynMotor::asynCallback, entry, pmsg=0x597bd4, command=6, interface=1, dvalue=0.000000
2014/05/02 10:10:56.273 devMotorAsyn::asynCallback: SMTR1608-9-B20-05:brag command=6, ivalue=0, dvalue=0.000000, pasynUser->reason=6
2014/05/02 10:10:56.274 asynMotorController:writeFloat64:: axis=0, function=6, value=0.000000
2014/05/02 10:10:56.274 asynManager::portThread port=XPS1 callback
devAsynMotor::asynCallback, entry, pmsg=0x60b224, command=5, interface=1, dvalue=0.000000
2014/05/02 10:10:56.285 devMotorAsyn::asynCallback: SMTR1608-9-B20-05:brag command=5, ivalue=0, dvalue=0.000000, pasynUser->reason=5
2014/05/02 10:10:56.291 asynMotorController:writeFloat64:: axis=0, function=5, value=0.000000
2014/05/02 10:10:56.299 SMTR1608-9-B20-05:brag devMotorAsyn::update_values, needUpdate=0
2014/05/02 10:10:56.303 asynManager::portThread port=XPS1 callback
devAsynMotor::asynCallback, entry, pmsg=0x60b3cc, command=7, interface=1, dvalue=0.000000
2014/05/02 10:10:56.308 devMotorAsyn::asynCallback: SMTR1608-9-B20-05:brag command=7, ivalue=0, dvalue=0.000000, pasynUser->reason=7
2014/05/02 10:10:56.310 asynMotorController:writeFloat64:: axis=0, function=7, value=0.000000
2014/05/02 10:10:56.311 asynManager::portThread port=XPS1 callback
devAsynMotor::asynCallback, entry, pmsg=0x60b574, command=0, interface=1, dvalue=0.000000
2014/05/02 10:10:56.314 devMotorAsyn::asynCallback: SMTR1608-9-B20-05:brag command=0, ivalue=0, dvalue=0.000000, pasynUser->reason=1
2014/05/02 10:10:56.316 XPSAxis:move: Set XPS XPS1, axis 0 move to 0.000000, min vel=0.000000, max_vel=0.000000, accel=0.000000, minJerk=0.005000, maxJerk=0.050000
2014/05/02 10:10:56.325 SendAndReceive unexpected response =-17,GroupMoveAbsolute (S.Pos,5.66625162537e-311),EndOfAPI
2014/05/02 10:10:56.329 XPSAxis:move: Error performing GroupMoveAbsolute[XPS1,0] -17
2014/05/02 10:10:56.330 SMTR1608-9-B20-05:brag devMotorAsyn::statusCallback new value=[p:60000.000000,e:60007.000000,s:4980] P
2014/05/02 10:10:56.332 asynMotorController:writeFloat64: Set driver XPS1, axis 0 move absolute to 0.000000, base velocity=0.000000, velocity=0.000000, acceleration=0.000000
2014/05/02 10:10:56.334 asynMotorController:writeFloat64 error, status=3 axis=0, function=1, value=0.000000
2014/05/02 10:10:56.336 devMotorAsyn::asynCallback: SMTR1608-9-B20-05:brag pasyn{Float64,Int32}->write returned
2014/05/02 10:10:56.337 SMTR1608-9-B20-05:brag devMotorAsyn::update_values, needUpdate=1
2014/05/02 10:10:56.344 XPSAxis:poll: [XPS1,0]: S.Pos axisStatus=11
2014/05/02 10:10:56.353 SMTR1608-9-B20-05:brag devMotorAsyn::statusCallback new value=[p:60000.000000,e:60007.000000,s:4982]
2014/05/02 10:10:56.354 SMTR1608-9-B20-05:brag devMotorAsyn::update_values, needUpdate=1
epics> dbpr SMTR1608-9-B20-05:brag 10
ACCL: 0.2 ACKS: NO_ALARM ACKT: YES ADEL: 0
ALST: 0 ASG: ASP: (nil) ATHM: 0
BACC: 0.2 BDST: 0 BKPT: 00 BVEL: 1
CARD: 0 CBAK: 0x597710 CDIR: 1 CNEN: Disable
DCOF: 0 DESC: Mono Brag DHLM: 59
DIFF: 18.6415275058764 DINP:CONSTANT DIR: Pos
DISA: 0 DISP: 0 DISS: NO_ALARM DISV: 1
DLLM: 1 DLY: 0 DMOV: 1 DOL:CONSTANT
DPVT: 0x597728 DRBV: 6 DSET: 0x47f3d0 DTYP: asynMotor
DVAL: 24.6415275058764 EGU: degrees ERES: 1.0e-04
EVNT: 0 FLNK:CONSTANT 0 FOF: 0 FOFF: Variable
FRAC: 1 HHSV: NO_ALARM HIGH: 0 HIHI: 0
HLM: 59 HLS: 0 HLSV: NO_ALARM HOMF: 0
HOMR: 0 HOPR: 0 HSV: NO_ALARM HVEL: 0.1
ICOF: 0 INIT: JAR: 5 JOGF: 0
JOGR: 0 JVEL: 1 LCNT: 0
LDVL: 24.6415275058764 LLM: 1 LLS: 0
LLSV: NO_ALARM LOCK: NO LOLO: 0 LOPR: 0
LOW: 0 LRLV: 0 LRVL: 246415 LSET: 0x597ff0
LSPG: Go LSV: NO_ALARM LVAL: 24.6415275058764
LVIO: 0 MDEL: 0 MIP: 0 MISS: 0
MLIS: 00 5c ee 80 00 5f b9 40 00 00 00 46 MLOK: 00 59 50 c8
MLST: 0 MMAP: 0 MOVN: 0 MRES: 1.0e-04
MSTA: 18818 NAME: SMTR1608-9-B20-05:brag NMAP: 0
NSEV: NO_ALARM NSTA: NO_ALARM NTM: YES NTMF: 2
OFF: 0 OMSL: supervisory OUT:INST_IO @asyn(XPS1,0)
PACT: 0 PCOF: 0 PHAS: 0 PINI: NO
POST: PP: 0 PPN: (nil) PPNR: (nil)
PREC: 5 PREM: PRIO: LOW PROC: 0
PUTF: 0 RBV: 6 RCNT: 0 RDBD: 1.0e-04
RDBL:CONSTANT RDES: 0x548f38 RDIF: 186415 REP: 60007
RHLS: 0 RINP:CONSTANT RLLS: 0 RLNK:CONSTANT
RLV: 0 RMOD: Default RMP: 60000 RPRO: 0
RRBV: 60000 RRES: 0 RSET: 0x47f1d0 RTRY: 0
RVAL: 246415 RVEL: 0 S: 50 SBAK: 50
SBAS: 5 SCAN: Passive SDIS:CONSTANT SET: Use
SEVR: NO_ALARM SMAX: 0 SPMG: Go SPVT: (nil)
SREV: 200 SSET: 0 STAT: NO_ALARM STOO:CONSTANT
STOP: 0 STUP: OFF SUSE: 0 SYNC: 0
TDIR: 0 TIME: 2014-05-02 10:12:37.121731000 TPRO: 0
TSE: 0 TSEL:CONSTANT TWF: 0 TWR: 0
TWV: 1 UDF: 0 UEIP: No UREV: 0.02
URIP: No VAL: 24.6415275058764 VBAS: 0.1
VELO: 1 VERS: 6.8 VMAX: 0 VOF: 0
epics> asynReport 10 XPS1
XPS1 multiDevice:Yes canBlock:Yes autoConnect:Yes
enabled:Yes connected:Yes numberConnects 1
nDevices 1 nQueued 0 blocked:No
asynManagerLock:No synchronousLock:No
exceptionActive:No exceptionUsers 0 exceptionNotifys 0
traceMask:0x1 traceIOMask:0x0 traceInfoMask:0x1
interposeInterfaceList
asynOctet pinterface 0x47f984 drvPvt 0x574470
interfaceList
asynCommon pinterface 0x47fb40 drvPvt 0x572760
asynDrvUser pinterface 0x47fc28 drvPvt 0x572760
asynOctet pinterface 0x47fb8c drvPvt 0x572760
asynInt32 pinterface 0x47fb4c drvPvt 0x572760
asynFloat64 pinterface 0x47fb7c drvPvt 0x572760
asynFloat64Array pinterface 0x47fbf0 drvPvt 0x572760
asynGenericPointer pinterface 0x47fc00 drvPvt 0x572760
addr 0 autoConnect Yes enabled Yes connected Yes exceptionActive No
exceptionActive No exceptionUsers 0 exceptionNotifys 0
blocked No
traceMask:0xff traceIOMask:0x2 traceInfoMask:0x1
XPS motor driver: XPS1
numAxes: 1
firmware version: XPS-Q8 Firmware Standard V1.2.1
moving poll period: 0.010000
idle poll period: 5.000000
enableSetPosition: 0
setPositionSettlingTime: 5.000000
IPAddress: 192.168.0.254
IPPort: 5001
ftpUserName: Administrator
ftpUserPassword: Administrator
movesDeferred: 0
autoEnable: 1
noDisableError: 0
axis 0
name = S.Pos
step size = 0.0001
poll socket = 0, moveSocket = 3
status = 11
Port: XPS1
Timestamp: <undefined>
Input EOS[0]:
Output EOS[0]:
Parameter list 0
Number of parameters is: 78
Parameter 0 type=asynFloat64, name=MOTOR_MOVE_REL, value is undefined
Parameter 1 type=asynFloat64, name=MOTOR_MOVE_ABS, value=0.000000, status=0
Parameter 2 type=asynFloat64, name=MOTOR_MOVE_VEL, value is undefined
Parameter 3 type=asynFloat64, name=MOTOR_HOME, value is undefined
Parameter 4 type=asynInt32, name=MOTOR_STOP_AXIS, value is undefined
Parameter 5 type=asynFloat64, name=MOTOR_VELOCITY, value=0.000000, status=0
Parameter 6 type=asynFloat64, name=MOTOR_VEL_BASE, value=0.000000, status=0
Parameter 7 type=asynFloat64, name=MOTOR_ACCEL, value=0.000000, status=0
Parameter 8 type=asynFloat64, name=MOTOR_POSITION, value=60000.000000, status=0
Parameter 9 type=asynFloat64, name=MOTOR_ENCODER_POSITION, value=60006.000000, status=0
Parameter 10 type=asynInt32, name=MOTOR_DEFER_MOVES, value is undefined
Parameter 11 type=asynInt32, name=MOTOR_MOVE_HOME, value is undefined
Parameter 12 type=asynFloat64, name=MOTOR_RESOLUTION, value is undefined
Parameter 13 type=asynFloat64, name=MOTOR_ENCODER_RATIO, value is undefined
Parameter 14 type=asynFloat64, name=MOTOR_PGAIN, value=0.000000, status=0
Parameter 15 type=asynFloat64, name=MOTOR_IGAIN, value=0.000000, status=0
Parameter 16 type=asynFloat64, name=MOTOR_DGAIN, value=0.000000, status=0
Parameter 17 type=asynFloat64, name=MOTOR_HIGH_LIMIT, value=590000.000000, status=0
Parameter 18 type=asynFloat64, name=MOTOR_LOW_LIMIT, value=10000.000000, status=0
Parameter 19 type=asynInt32, name=MOTOR_CLOSED_LOOP, value is undefined
Parameter 20 type=asynInt32, name=MOTOR_STATUS, value=18818, status=0
Parameter 21 type=asynInt32, name=MOTOR_UPDATE_STATUS, value is undefined
Parameter 22 type=asynInt32, name=MOTOR_STATUS_DIRECTION, value=0, status=0
Parameter 23 type=asynInt32, name=MOTOR_STATUS_DONE, value=1, status=0
Parameter 24 type=asynInt32, name=MOTOR_STATUS_HIGH_LIMIT, value=0, status=0
Parameter 25 type=asynInt32, name=MOTOR_STATUS_AT_HOME, value is undefined
Parameter 26 type=asynInt32, name=MOTOR_STATUS_SLIP, value is undefined
Parameter 27 type=asynInt32, name=MOTOR_STATUS_POWERED, value is undefined
Parameter 28 type=asynInt32, name=MOTOR_STATUS_FOLLOWING_ERROR, value=0, status=0
Parameter 29 type=asynInt32, name=MOTOR_STATUS_HOME, value=1, status=0
Parameter 30 type=asynInt32, name=MOTOR_STATUS_HAS_ENCODER, value=1, status=0
Parameter 31 type=asynInt32, name=MOTOR_STATUS_PROBLEM, value=0, status=0
Parameter 32 type=asynInt32, name=MOTOR_STATUS_MOVING, value=0, status=0
Parameter 33 type=asynInt32, name=MOTOR_STATUS_GAIN_SUPPORT, value=1, status=0
Parameter 34 type=asynInt32, name=MOTOR_STATUS_COMMS_ERROR, value=0, status=0
Parameter 35 type=asynInt32, name=MOTOR_STATUS_LOW_LIMIT, value=0, status=0
Parameter 36 type=asynInt32, name=MOTOR_STATUS_HOMED, value=1, status=0
Parameter 37 type=asynInt32, name=PROFILE_NUM_AXES, value is undefined
Parameter 38 type=asynInt32, name=PROFILE_NUM_POINTS, value is undefined
Parameter 39 type=asynInt32, name=PROFILE_CURRENT_POINT, value is undefined
Parameter 40 type=asynInt32, name=PROFILE_NUM_PULSES, value is undefined
Parameter 41 type=asynInt32, name=PROFILE_START_PULSES, value is undefined
Parameter 42 type=asynInt32, name=PROFILE_END_PULSES, value is undefined
Parameter 43 type=asynInt32, name=PROFILE_ACTUAL_PULSES, value is undefined
Parameter 44 type=asynInt32, name=PROFILE_NUM_READBACKS, value is undefined
Parameter 45 type=asynInt32, name=PROFILE_TIME_MODE, value is undefined
Parameter 46 type=asynFloat64, name=PROFILE_FIXED_TIME, value is undefined
Parameter 47 type=asynFloat64Array, name=PROFILE_TIME_ARRAY, value is undefined
Parameter 48 type=asynFloat64, name=PROFILE_ACCELERATION, value is undefined
Parameter 49 type=asynInt32, name=PROFILE_BUILD, value is undefined
Parameter 50 type=asynInt32, name=PROFILE_BUILD_STATE, value is undefined
Parameter 51 type=asynInt32, name=PROFILE_BUILD_STATUS, value is undefined
Parameter 52 type=string, name=PROFILE_BUILD_MESSAGE, value is undefined
Parameter 53 type=asynInt32, name=PROFILE_EXECUTE, value is undefined
Parameter 54 type=asynInt32, name=PROFILE_EXECUTE_STATE, value=0, status=0
Parameter 55 type=asynInt32, name=PROFILE_EXECUTE_STATUS, value is undefined
Parameter 56 type=string, name=PROFILE_EXECUTE_MESSAGE, value is undefined
Parameter 57 type=asynInt32, name=PROFILE_ABORT, value is undefined
Parameter 58 type=asynInt32, name=PROFILE_READBACK, value is undefined
Parameter 59 type=asynInt32, name=PROFILE_READBACK_STATE, value is undefined
Parameter 60 type=asynInt32, name=PROFILE_READBACK_STATUS, value is undefined
Parameter 61 type=string, name=PROFILE_READBACK_MESSAGE, value is undefined
Parameter 62 type=asynInt32, name=PROFILE_USE_AXIS, value is undefined
Parameter 63 type=asynFloat64Array, name=PROFILE_POSITIONS, value is undefined
Parameter 64 type=asynFloat64Array, name=PROFILE_READBACKS, value is undefined
Parameter 65 type=asynFloat64Array, name=PROFILE_FOLLOWING_ERRORS, value is undefined
Parameter 66 type=asynFloat64, name=PROFILE_MOTOR_RESOLUTION, value is undefined
Parameter 67 type=asynInt32, name=PROFILE_MOTOR_DIRECTION, value is undefined
Parameter 68 type=asynFloat64, name=PROFILE_MOTOR_OFFSET, value is undefined
Parameter 69 type=asynFloat64, name=XPS_MIN_JERK, value=0.005000, status=0
Parameter 70 type=asynFloat64, name=XPS_MAX_JERK, value=0.050000, status=0
Parameter 71 type=asynFloat64, name=XPS_PROFILE_MAX_VELOCITY, value is undefined
Parameter 72 type=asynFloat64, name=XPS_PROFILE_MAX_ACCELERATION, value is undefined
Parameter 73 type=asynFloat64, name=XPS_PROFILE_MIN_POSITION, value is undefined
Parameter 74 type=asynFloat64, name=XPS_PROFILE_MAX_POSITION, value is undefined
Parameter 75 type=string, name=XPS_PROFILE_GROUP_NAME, value is undefined
Parameter 76 type=string, name=XPS_TRAJECTORY_FILE, value is undefined
Parameter 77 type=asynInt32, name=XPS_STATUS, value=11, status=0
int32 callback client address=0xd42c8, addr=0, reason=77, userPvt=0x5935c8
float64 callback client address=0xdf1cc, addr=0, reason=8, userPvt=0x596aa0
genericPointer callback client address=0x927a8, addr=0, reason=20, userPvt=0x597728
- Replies:
- Re: Newport XPS-Q8 and Motor Record - armv5teb architecture J. Lewis Muir
- Re: Newport XPS-Q8 and Motor Record - armv5teb architecture Torsten Bögershausen
- Navigate by Date:
- Prev:
Re: Point Grey Flea3 areaDetector ImageJ Viewer Problems Zachary Brown
- Next:
Re: Newport XPS-Q8 and Motor Record - armv5teb architecture J. Lewis Muir
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
<2014>
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
- Navigate by Thread:
- Prev:
RE: Point Grey Flea3 areaDetector ImageJ Viewer Problems Mark Rivers
- Next:
Re: Newport XPS-Q8 and Motor Record - armv5teb architecture J. Lewis Muir
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
<2014>
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
|