This function block is used for calculating the distance and bearing (direction) between two latitude/longitude positions.
The input to this function block is the same format as the gpsFix() deliver positions in.
Also see gpsDistanceX().
Input:
Position 1:
lat1south : BOOL
True is south, false is north.
lat1deg : SINT
Degrees (0..90).
lat1min : SINT
Minutes (0..59).
lat1decmin : INT
Decimal minutes (0..9999).
lon1west : BOOL
True is west, false is east.
lon1deg : INT
Degrees (0..180).
lon1min : SINT
Minutes (0..59).
lon1decmin : INT
Decimal minutes (0..9999).
Position 2:
lat2south : BOOL
True is south, false is north.
lat2deg : SINT
Negative is south (-90..+90).
lat2min : SINT
Minutes (0..59).
lat2decmin : INT
Decimal minutes (0..9999).
lon2west : BOOL
True is west, false is east.
lon2deg : INT
Negative is west (-180..+180).
lon2min : SINT
Minutes (0..59).
lon2decmin : INT
Decimal minutes (0..9999).
Output:
distance : DINT
Distance between the two positions in meters.
bearing : INT
Bearing between the two points in degrees.
Declaration:
FUNCTION_BLOCK gpsDistance;
VAR_INPUT
lat1south : BOOL;
lat1deg : SINT;
lat1min : SINT;
lat1decmin : INT;
lon1west : BOOL;
lon1deg : INT;
lon1min : SINT;
lon1decmin : INT;
lat2south : BOOL;
lat2deg : SINT;
lat2min : SINT;
lat2decmin : INT;
lon2west : BOOL;
lon2deg : INT;
lon2min : SINT;
lon2decmin : INT;
END_VAR;
VAR_OUTPUT
distance : DINT;
bearing : INT;
END_VAR;
Example:
INCLUDE rtcu.inc
VAR_OUTPUT
gsmConnect : BOOL;
gpsValid : BOOL;
END_VAR;
PROGRAM GPS_Example;
VAR
sms : gsmIncomingSMS;
gps : gpsFix;
gc : gpsDistance;
str : STRING;
awaitFix : BOOL;
END_VAR;
gpsPower(power:=TRUE);
gsmPower(power:=TRUE);
BEGIN
gps();
IF gps.mode > 1 THEN
gc(lat1south:=FALSE, lat1deg:=55, lat1min:=51, lat1decmin:=3078, lon1west:=FALSE, lon1deg:=9, lon1min:=51, lon1decmin:=530,
lat2south:=gps.latsouth, lat2deg:=gps.latdeg, lat2min:=gps.latmin, lat2decmin:=gps.latdecmin,
lon2west:=gps.lonwest, lon2deg:=gps.londeg, lon2min:=gps.lonmin, lon2decmin:=gps.londecmin);
str:=strFormat(format:="Distance to Logic IO=\4.\3 KM, bearing=\2 deg", v4:=gc.distance/1000, v3:=INT(gc.distance MOD 1000), v2:=gc.bearing);
END_IF;
IF sms.status > 0 THEN
awaitFix:=TRUE;
END_IF;
IF awaitFix AND gps.mode > 1 THEN
awaitFix:=FALSE;
gsmSendSMS(phonenumber:=sms.phonenumber, message:=str);
END_IF;
gsmConnect:=gsmConnected();
gpsValid:=gps.mode > 1;
END;
END_PROGRAM;
|