private decimal[] _MapArgValues()
        {
            var vals = new decimal[VarCount];

            if (vals.Length > 0)
            {
                foreach (var s in _localVariables)
                {
                    Variable <decimal> v;
                    if (!LocalVariables.TryGet(s, out v))
                    {
                        _nan = true;
                        return(null);
                    }
                    vals[_ms.ArgIndex(v.Name)] = v.Value;
                }

                if (_remoteVariables.Count > 0)
                {
                    int i       = 0;
                    var packets = new VarPacket[_remoteVariables.Count];
                    foreach (var vs in _remoteVariables)
                    {
                        packets[i++] = VarPacket.CreateReadRequest(this, new IPEndPoint(vs.Key, _communicator.Port), vs.Value);
                    }

                    _receivedVars = new List <VarPacket>(packets.Length);

                    foreach (var p in packets)
                    {
                        _communicator.Send(p);
                    }

                    while (_receivedVars.Count < packets.Length && _errors.Count == 0 && !_nan)
                    {
                        Thread.Sleep(1);
                        if (_cancel)
                        {
                            _errors.Add("Cancelled.");
                            return(null);
                        }
                    }

                    if (_errors.Count > 0 || _nan)
                    {
                        return(null);
                    }

                    for (i = 0; i < packets.Length; ++i)
                    {
                        if (!_receivedVars[i].IsReadResponseOk)
                        {
                            _nan = true;
                            _errors.Add("Host at " + packets[i].EndPoint + " returned NaN.");
                            return(null);
                        }
                        var ip     = packets[i].EndPoint.Address;
                        var names  = packets[i].RequestVarNames;
                        var values = _receivedVars[i].ReadResponseVarValues;
                        for (int j = 0; j < names.Length; ++j)
                        {
                            vals[_ms.ArgIndex("{" + ip.ToString() + "}." + names[j])] = values[j];
                        }
                    }
                    _receivedVars = null;
                }
            }
            return(vals);
        }